随便写的
//
// main.cpp
// test
//
// Created by ao quan on 2021/2/6.
//
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int > subvector(vector<int> nums,int begin,int len){
vector<int> ans;
for(int i=0;i<len;i++){
ans.push_back(nums[i+begin]);
}
return ans;
}
void printvector(vector<int> nums){
for(int i=0;i<nums.size();i++){
cout << nums[i];
}
cout <<endl;
}
vector<vector<int>> katelan(vector<int> nums){
//cout <<"1";
vector<vector<int >> ans;
if(nums.size()==1) {
ans.push_back(nums);
return ans;
}
if(nums.size()==0) return ans;
int len=nums.size();
for(int i=0;i<len;i++){
vector<vector<int> > left=katelan(subvector(nums, 0, i));
vector<vector<int>> right=katelan(subvector(nums, i+1, len-1-i));
if(right.size()==0 and left.size()!=0){
for(int j=0;j<left.size();j++){
vector<int> tmp;
tmp.insert(tmp.begin(), left[j].begin(),left[j].end());
tmp.push_back(nums[i]);
ans.push_back(tmp);
}
}
else if(right.size()!=0 and left.size()==0){
for(int j=0;j<right.size();j++){
vector<int> tmp;
tmp.insert(tmp.begin(), right[j].begin(),right[j].end());tmp.push_back(nums[i]);
ans.push_back(tmp);
}
}
else{
for(int j=0;j<left.size();j++){
for(int k=0;k<right.size();k++){
vector<int> tmp;
tmp.insert(tmp.begin(), left[j].begin(),left[j].end());
tmp.insert(tmp.begin(), right[k].begin(),right[k].end());
tmp.push_back(nums[i]);
ans.push_back(tmp);
}
}
}
/*
for(auto it=left.begin();it!=left.end();it++){
for(auto it_tmp=right.begin();it_tmp!=right.end();it_tmp++){
vector<int> tmp;
tmp.insert(tmp.begin(), (*it).begin(),(*it).end());
tmp.insert(tmp.begin(), (*it_tmp).begin(),(*it_tmp).end());
tmp.push_back(nums[i]);
ans.push_back(tmp);
//printvector(tmp);
}
}*/
}
return ans;
}
int main(int argc, const char * argv[]) {
// insert code here...
string main_str="abcabeabcabc";
string patter="abcabc";
int main_index=0;
int patter_index=0;
vector<int> next;
for(int i=1;i<=5;i++){next.push_back(i);}
printvector(next);
vector<vector<int>> ans=katelan(next);
cout <<"begin:"<<ans.size()<<endl;
for(auto it=ans.begin();it!=ans.end();it++){
for(auto itit=(*it).begin();itit!=(*it).end();itit++){
cout <<*itit<<" ";
}
cout <<endl;
}
return 0;
}
注意left和right不能直接嵌套要先判断size