现在的位置: 首页 > 综合 > 正文

字符串的排列组合问题

2013年05月23日 ⁄ 综合 ⁄ 共 1341字 ⁄ 字号 评论关闭

转自: http://blog.csdn.net/wuzhekai1985

问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符abc所能排列出来的所有字符串abcacbbacbcacabcba

    思路:这是个递归求解的问题。递归算法有四个特性:(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 == '\0')  
  29.     {  
  30.         cout<<pStr<<endl;  
  31.     }  
  32.     else  
  33.     {  
  34.         char *pCh = pBegin;  
  35.         while(*pCh != '\0')  
  36.         {  
  37.             swap(*pBegin, *pCh);  
  38.             Permutation_Solution2(pStr, pBegin + 1);  

抱歉!评论已关闭.