题目一
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路
关键抓住生成全排列的方式,两两交换,递归生成
(二次复位)
abcd bacd cbad dbca
对于abcd:可以固定a,再次从b开始两两交换,abcd acbd adcb
以此类推
(单次复位)
abcd bacd cabd dabc
对于abcd:固定a,生成abcd acbd adbd
两种方式生成一样的全排列,只不过输出的顺序一样,单次复位是有字典序的。
代码根据递归实现
class Solution { public: vector<string> Permutation(string str) { vector<string> array; if(str.size() == 0) return array; Permutation(array, str, 0); sort(array.begin(), array.end()); // 字典序输出 return array; } void Permutation(vector<string> &array, string str, int begin)// 遍历第begin位的所有可能性 { if(begin == str.size()-1) array.push_back(str); for(int i = begin; i <= str.size() - 1; i++) { if(i != begin && str[i] == str[begin])// 有重复字符时,跳过 continue; swap(str[i], str[begin]); Permutation(array, str, begin+1); // 遍历其后面的所有字符; // swap(str[i], str[begin]); } } };
题目二
求字符串所有的组合。
思路
核心思想是不断利用递归实现
class Solution { public: void Combination(char* str){ vector<char> res; length = strlen(str); for (int i = 1; i <= length; i++) // 所有组合就是 1组合 2组合 ... n组合 combination(str, i, res); return; } void Combination(char* str, int number, vector<char> &res){ if (number == 0) print; if (*string == '\0') return; res.push_back(*str); // 选了该元素 Combination(str + 1, number - 1, res); res.pop_back(); Combination(str + 1, number, res); } };