当前位置:   article > 正文

字符串排列(全排列)_字符串排列,给定一个字符串stringa

字符串排列,给定一个字符串stringa

题目描述

编写一个方法,确定某字符串的所有排列组合。

给定一个string A和一个int n,代表字符串和其长度,请返回所有该字符串字符的排列,保证字符串长度小于等于11且字符串中字符均为大写英文字符,排列中的字符串按字典序从大到小排序。(不合并重复字符串)

测试样例:

"ABC"
返回:["CBA","CAB","BCA","BAC","ACB","ABC"]

Solution 1

  1. //标志位法
  2. class Permutation {
  3. public:
  4. static bool cmp(const string str1,const string str2)
  5. {
  6. return str1>str2;
  7. }
  8. void permutation(vector<string>&ans,int index,vector<int>flag,string str,string temp)
  9. {
  10. temp+=str[index];
  11. flag[index]=1;
  12. for(int i=0;i<str.size();++i)
  13. {
  14. if(!flag[i])
  15. permutation(ans,i,flag,str,temp);
  16. }
  17. if(temp.size()==str.size()) ans.push_back(temp);
  18. }
  19. vector<string> getPermutation(string A) {
  20. vector<string>res;
  21. vector<int>state(A.size());
  22. fill(state.begin(),state.end(),0);
  23. string ch;
  24. for(int i=0;i<A.size();++i)
  25. {
  26. ch="";
  27. permutation(res,i,state,A,ch);
  28. }
  29. sort(res.begin(),res.end(),cmp);
  30. return res;
  31. }
  32. };

Solution 2

  1. //拆分法,可以将abcd拆分为a[bcd]、b[acd]、c[abd]、d[abc],其中[]代表全排列
  2. class Permutation {
  3. public:
  4. void permutation(string str,vector<string>&ans,int cnt)
  5. {
  6. if(cnt==str.size()-1) ans.push_back(str);
  7. for(int i=cnt;i<str.size();++i)
  8. {
  9. swap(str[cnt],str[i]);
  10. permutation(str,ans,cnt+1);
  11. swap(str[cnt],str[i]);
  12. }
  13. }
  14. vector<string> getPermutation(string A) {
  15. vector<string>res;
  16. if(A.size()<=0) return res;
  17. permutation(A,res,0);
  18. sort(res.begin(),res.end(),greater<string>());
  19. return res;
  20. }
  21. };

同样的算法可以应用于数组,见   全排列的不同方式(递归和STL算法)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/806737
推荐阅读
相关标签
  

闽ICP备14008679号