输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
1 class Solution { 2 public: 3 vector<string> Permutation(string str) { 4 vector<string> res; 5 int n=str.size(); 6 if(n<1) return res; 7 string s(str); 8 StringPermutation(s,0,n-1,res); 9 return res; 10 } 11 private: 12 void StringPermutation(string &str,int begin,int end,vector<string>& res){ 13 if(begin==end) 14 res.push_back(str); 15 for(int i=begin;i<=end;i++){ 16 if(isSame(str,begin,i)) 17 continue; 18 else{ 19 swap(str[begin],str[i]); 20 StringPermutation(str,begin+1,end,res); 21 swap(str[begin],str[i]); 22 } 23 } 24 } 25 bool isSame(string str,int begin,int end){ 26 for(int i=begin;i<end;i++){ 27 if(str[i]==str[end]) 28 return true; 29 } 30 return false; 31 } 32 };
来源http://blog.csdn.net/wuzhekai1985
问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。
对于字符串的排列问题。如果能生成n - 1个元素的全排列,就能生成n个元素的全排列。对于只有1个元素的集合,可以直接生成全排列。全排列的递归终止条件很明确,只有1个元素时。下面这个图很清楚的给出了递归的过程。
参考代码:解法1通过Permutation_Solution1(str, 0, n); 解法2通过调用Permutation_Solution2(str, str)来求解问题。
1 //函数功能 : 求一个字符串某个区间内字符的全排列 2 //函数参数 : pStr为字符串,begin和end表示区间 3 //返回值 : 无 4 void Permutation_Solution1(char *pStr, int begin, int end) 5 { 6 if(begin == end - 1) //只剩一个元素 7 { 8 for(int i = 0; i < end; i++) //打印 9 cout<<pStr[i]; 10 cout<<endl; 11 } 12 else 13 { 14 for(int k = begin; k < end; k++) 15 { 16 swap(pStr[k], pStr[begin]); //交换两个字符 17 Permutation_Solution1(pStr, begin + 1, end); 18 swap(pStr[k],pStr[begin]); //恢复 19 } 20 } 21 } 22 23 //函数功能 : 求一个字符串某个区间内字符的全排列 24 //函数参数 : pStr为字符串,pBegin为开始位置 25 //返回值 : 无 26 void Permutation_Solution2(char *pStr, char *pBegin) 27 { 28 if(*pBegin == '