排列组合

我不是女神ヾ 2022-09-17 06:27 314阅读 0赞

排列组合问题:

  1. 字符串全排列(permutation) 转自:http://www.cnblogs.com/sujz/archive/2011/06/16/2082831.html

问题:给定字符串S,生成该字符串的全排列。
方法1:依次从字符串中取出一个字符作为最终排列的第一个字符,对剩余字符组成的字符串生成全排列,最终结果为取出的字符和剩余子串全排列的组合。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. void permute1(string prefix, string str)
  5. {
  6. if(str.length() == 0)
  7. cout << prefix << endl;
  8. else
  9. {
  10. for(int i = 0; i < str.length(); i++)
  11. permute1(prefix+str[i], str.substr(0,i)+str.substr(i+1,str.length()));
  12. }
  13. }
  14. void permute1(string s)
  15. {
  16. permute1("",s);
  17. }
  18. int main()
  19. {
  20. //method1, unable to remove duplicate permutations.
  21. cout << "method1" << endl;
  22. permute1("ABA");
  23. }

优点:该方法易于理解,但无法移除重复的排列,如:s=”ABA”,会生成两个“AAB”。

方法2:利用交换的思想,具体见实例,但该方法不如方法1容易理解。

2011061616243556.gif

  1. #include <iostream>
  2. #include <string>
  3. #include <cstdio>
  4. using namespace std;
  5. void swap(char* x, char* y)
  6. {
  7. char tmp;
  8. tmp = *x;
  9. *x = *y;
  10. *y = tmp;
  11. }
  12. /* Function to print permutations of string
  13. This function takes three parameters:
  14. 1. String
  15. 2. Starting index of the string
  16. 3. Ending index of the string. */
  17. void permute(char *a, int i, int n)
  18. {
  19. int j;
  20. if (i == n)
  21. printf("%s\n", a);
  22. else
  23. {
  24. for (j = i; j <= n; j++)
  25. {
  26. if(a[i] == a[j] && j != i) //为避免生成重复排列,当不同位置的字符相同时不再交换
  27.    continue;
  28. swap((a+i), (a+j));
  29. permute(a, i+1, n);
  30. swap((a+i), (a+j)); //backtrack
  31. }
  32. }
  33. }
  34. int main()
  35. {
  36. //method2
  37. cout << "method2" << endl;
  38. char a[] = "ABA";
  39. permute(a,0,2);
  40. return 0;
  41. }

两种方法的生成结果:
method1:
ABA
AAB
BAA
BAA
AAB

ABA

method2:

ABA
AAB
BAA

请按任意键继续. . .

  1. 组合 转自:http://www.cnblogs.com/GoAhead/archive/2012/05/30/2526563.html

方法:依次递归地对所有的组合形式进行枚举,从一个字符到n个字符。

对于m个字符的组合,遍历n个字符,决定是否取当前的字符,一直取到足够m个为止,即遍历所有的取法。

  1. #include <iostream>
  2. #include <stack>
  3. #include <vector>
  4. using namespace std;
  5. // 函数功能 : 从一个字符串中选m个元素
  6. // 函数参数 : pStr为字符串, m为选的元素个数, result为选中的
  7. // 返回值 : 无
  8. void Combination_m(char *pStr, int m, vector<char> &result)
  9. {
  10. if(pStr == NULL || (*pStr == '\0'&& m != 0))
  11. return;
  12. if(m == 0) // 递归终止条件
  13. {
  14. for(unsigned i = 0; i < result.size(); i++)
  15. cout << result[i];
  16. cout << endl;
  17. return;
  18. }
  19. // 选择这个元素
  20. result.push_back(*pStr);
  21. Combination_m(pStr + 1, m - 1, result);
  22. result.pop_back();
  23. // 不选择这个元素
  24. Combination_m(pStr + 1, m, result);
  25. }
  26. // 函数功能 : 求一个字符串的组合
  27. // 函数参数 : pStr为字符串
  28. // 返回值 : 无
  29. void Combination(char *pStr)
  30. {
  31. if(pStr == NULL || *pStr == '\0')
  32. return;
  33. int number = strlen(pStr);
  34. for( int i = 1; i <= number; i++)
  35. {
  36. vector<char> result;
  37. Combination_m(pStr, i, result);
  38. }
  39. }
  40. int main()
  41. {
  42. char str[] = {'A', 'B', 'A', '\0'};
  43. Combination(str);
  44. return 0;
  45. }

结果:

A
B
A
AB
AA
BA
ABA

问题:由于是组合,因此字符串中不能存在相同的字符,如若存在,则需要将他们当做不同的值对待,即不同位置上的相同字符认为是不同的字符。

注: 想要去除重复组合,在进行之前就应该将字符串中的重复字符筛选掉。

发表评论

表情:
评论列表 (有 0 条评论,314人围观)

还没有评论,来说两句吧...

相关阅读

    相关 字符串排列组合

    网上有好多字符串排列组合的文章,自己看了,学习了,把代码留下,以备以后用。 自己也写了个八皇后的代码,也留着以后复习方便。 include<iostream>

    相关 排列组合

    排列与组合 文章目录 排列与组合 前言 方法1 方法2 前言 诚然,排列组合作为高考数学里的送分题,它的出现让

    相关 重温排列组合

    高中学过的排列组合到现在已经很模糊了,最近在写程序的时候,需要用到排列组合优化输出结果,拿来用的时候发现,排列组合很模糊,这个 怎么计算呢,习惯性的打开了百度 搜索一下,找一下

    相关 排列组合

    1.引言        pku的OJ平台1731题,就是求一个输入字符串的全排列。在STL中有两个和排列相关的算法,next\_permutation和prev\_per

    相关 PHP 排列组合

    几个排列组合例子:【递归】 一、出处:[对数组作排列组合的PHP算法 | maraboy][PHP_ _ maraboy] function array_comb(