题解 | #全排列#
全排列
http://www.nowcoder.com/practice/5632c23d0d654aecbc9315d1720421c1
非递归方式
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
//递归和循环都写一个
string getnext(string s){
//当最后两位是升序的时候,就调成降序;是降序的时候,就往前while寻求进位。
int n = s.size();
if(n==1){
return "-1";
}
if(s[n-2] < s[n-1]){
sort(s.end()-2,s.end(),greater<char>());
return s;
}else if(n==2){
return "-1";
}else{
int i = n-3;
while(i>=0){
if(s[i] < s[i+1]){//则可以实现“进位”
int j = n-1;
while(s[j] <= s[i]){
j--;
}
swap(s[i],s[j]);
sort(s.begin()+i+1,s.end());
return s;
}
i--;
}
return "-1";
}
}
void xunhuan(string s){
do{
printf("%s\n",s.c_str());
s = getnext(s);
}while(s != "-1");
return;
}
int main(){
string s;
while(cin >> s){
sort(s.begin(),s.end());
// digui(s, 0);
xunhuan(s);
s.clear();
}
return 0;
}