博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串全排列-非递归算法
阅读量:5916 次
发布时间:2019-06-19

本文共 2029 字,大约阅读时间需要 6 分钟。

字符串的全排列非递归算法是每次都寻找比前序列大一点的序列,如:

起点:字典序最小的排列,例如12345

终点:字典序最大的排列,例如54321

过程:从当前排列生成字典序刚好比它大的下一个排列。

算法过程:后找、小大、交换、翻转

后找:字符串中最后一个升序的位置i,即S[k]>S[k+1](k>i),S[i]<S[i+1];

查找(小大):S[i+1...N-1]中比Ai大的最小值Sj;

交换:Si,Sj;

翻转:S[i+1...N-1]

 

代码如下:

1 #include 
2 #include
3 using namespace std; 4 5 //交换 6 void swap(char &c1, char &c2) 7 { 8 char temp = c1; 9 c1 = c2; 10 c2 = temp; 11 } 12 13 //翻转 14 void reverse_string(string &str, int from, int to) 15 { 16 while(from < to) 17 { 18 swap(str[from++], str[to--]); 19 } 20 } 21 22 //找最小值的下标 23 int Find_min(string str, int from, int to) 24 { 25 char min = str[from]; 26 int j = from; 27 if(from == to) 28 { 29 return j; 30 } 31 for(int i = from + 1; i <= to; ++i) 32 { 33 //查找比str[from - 1]大的最小值 34 if(str[i] <= min && str[i] > str[from - 1]) 35 { 36 min = str[i]; 37 j = i; 38 } 39 } 40 return j; 41 } 42 43 void permutation_2(string &str, int from, int to) 44 { 45 string end_str(str); 46 reverse_string(end_str, from, to); 47 cout << str << endl; 48 while(str != end_str) 49 { 50 int i = from; 51 int j = to; 52 while(i != j) 53 { 54 if(str[j -1] < str[j]) 55 { 56 break; 57 } 58 j--; 59 } 60 int min = Find_min(str, j, to); 61 swap(str[j-1], str[min]); 62 reverse_string(str, j, to); 63 cout << str << endl; 64 } 65 //把str翻转回来 66 reverse_string(str, from, to); 67 } 68 69 int main(int argc, const char *argv[]) 70 { 71 string str = "1223"; 72 int len = str.size(); 73 permutation_2(str, 0, len - 1); 74 return 0; 75 }

结果:

注意:C++STL已经在Algorithm中集成了next_permutation。可以将给定的字符串A[0...N-1]首先升序排序,然后依次调用next_permutation直到返回false,即完成了非递归的全排列算法。 

转载于:https://www.cnblogs.com/bigshowxin/p/4418232.html

你可能感兴趣的文章
凤凰金融荣获"互联网金融十大创新品牌"
查看>>
HBase全网最佳学习资料汇总
查看>>
微金时代:小贷公司贷前调查的重要性和发展前景
查看>>
又一重大漏洞现身 “疯怪”危及世界互联网安全
查看>>
【白硕】当人工智能遇到区块链,是惊鸿一瞥还是天长地久?
查看>>
怎么选择合适的嵌入式设计软件?
查看>>
Oracle收购Wercker开启容器盛宴
查看>>
中国人工智能学会通讯——NLP与知识图谱的对接
查看>>
IDC:曙光斩获2015年中国NAS网络存储上半年第一名
查看>>
网络安全问题日益严重 但是我们的安全意识远远没有跟上
查看>>
大数据:释放应用价值,数据融合先行
查看>>
Nginx面试中最常见的18道题 抱佛脚必备
查看>>
FBI端掉Dridex僵尸网络,拘捕了嫌疑人
查看>>
美团数据库运维自动化系统构建之路
查看>>
可以使你成为更优秀程序员的5个好习惯
查看>>
惊!莫让远程管理软件为僵尸网络做贡献
查看>>
不再过度强调全闪性能,SolidFire眼中的新一代数据中心是啥样
查看>>
众多玩家进入智能服装研发,内衣袜子开始变得与众不同
查看>>
美国国土安全部部长约翰逊就Dyn网络攻击事件发表声明
查看>>
想在Windows 10中运行openSUSE?请参照此安装方法
查看>>