描述
输入描述:
- 首先遇到重复问题,首先想到通过集合,以尝试解决字符重复的问题,简化问题。
- 然后就是比较简单的递归了:
- 确定递归函数功能(有点类似DP中确定状态,不过一个是结果,一个是动作):返回第第 i 个字符字符到最后一个字符的全排列。
- 确定出口和逻辑处理(可先画递归树结构寻找规律)。
1 #include<iostream> 2 using namespace std; 3 #include<queue> 4 #include<vector> 5 #include<string> 6 #include<set> 7 8 class Solution { 9 public: 10 // 通过集合解决重复的问题,简化问题 11 // 然后就是一个很简单的递归了。 12 vector<string> Permutation(string str) { 13 // 将集合转换为vector 14 vector<string> st; 15 if(str.empty()){ 16 return st; 17 } 18 set<string> se=permaute(str); 19 set<string>::iterator ite=se.begin(); 20 21 for(;ite!=se.end();++ite){ 22 st.push_back(*ite); 23 } 24 return st; 25 } 26 27 // 每次递归,弄一个集合,然后返回上层递归时,将集合和当前字符组合 28 set<string> permaute(string remain){ 29 set<string> curSet; 30 int len=remain.size(); 31 if(len==1){ 32 curSet.insert(remain); 33 return curSet; 34 } 35 for(int i=0;i<len;++i){ 36 // 更新下一层的remain 37 string br=remain; 38 string::iterator ite=br.begin(); 39 std::advance(ite,i); // 向后移动i个位置 40 br.erase(ite); 41 // int a=1; 42 set<string> belowSet=permaute(br); 43 // 组合下一层的集合 44 set<string>::iterator site=belowSet.begin(); 45 while(!belowSet.empty() && site!=belowSet.end()){ 46 curSet.insert(remain[i]+*site); 47 ++site; 48 } 49 } 50 return curSet; 51 } 52 }; 53 54 int main() { 55 Solution* sol = new Solution(); 56 string remain="ab"; 57 vector<string> vs=sol->Permutation(remain); 58 vector<string>::iterator ite=vs.begin(); 59 for(;ite!=vs.end();++ite){ 60 string el=*ite; 61 for(int i=0;i<el.size();++i){ 62 cout<<el[i]; 63 } 64 cout<<endl; 65 } 66 return 0; 67 }