标签:index int 排列 递归 实现 -- while str include
全排列非递归实现
思路
eg:1234
全排列:
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321
拿3241举例:string str = "3241"
- 从字符串的后往前找到一对(小,大)
(4,1)不是(小,大),再往前看。
(2,4)是(小,大);OK
此时index = 1,即str[index] = '2'
- 让index指针指向2,从字符串的后往前找(在str[index]之后找,不能找到前面去),找到第一个比
str[index] = '2'
大的字符,这个字符是’4’。 - 将str[index] 和 从后往前第一个比它大的字符 交换,得到
str="3421"
; 3421
,此时str[index]='4'
,将str[index]之后的字符("21"
)倒序即可得到"3412"
;
code
#include <iostream>
#include <cstdio>
#include <string>
#include<algorithm>
using namespace std;
string str;
bool GetNextPermutation(){
int n=str.size();
int index = n-1;
//当前一个比后一个大,就往前移
while(index>=1 && str[index-1]>str[index]){
index--;
}
//while循环退出时,前一个比后一个小,此时index指向后一个大的
index--; //index移到小的
// 如果找不到前一个比后一个小,此时index=0,从而跳出上面的while循环,再进行index--,使得index=-1;
// eg:54321; 全排列结束的地方
if(index<0){
return false;
}
for (int i = n-1; i > index; --i)
{
//从str的结尾处往前找,找到第一个比str[index]大的,swap
if(str[index]<str[i]){
swap(str[index],str[i]);
break;
}
}
//对index后面的字符排序
reverse(str.begin()+index+1,str.end());
return true;
}
int main()
{
while (cin>>str)
{
sort(str.begin(),str.end());
do{
cout<<str<<endl;
}while (GetNextPermutation());
}
return 0;
}
参考资料:王道考研2021计算机复试课程
标签:index,int,排列,递归,实现,--,while,str,include 来源: https://blog.csdn.net/sjxgghg/article/details/113836925
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。