Algorithm L是高德纳发明的一种全排列算法。
对于sequence a[0], a[1], ... ,a[j], a[j+1], ... , a[n]。
简单步骤:
1. 从后向前寻找第一个a[j] < a[j+1], 记录j。
2. 从后向前寻找第一个a[m] > a[j],记录m。
3.交换a[j], a[m].
4. reverse a[j+1 ... m]。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char s[100];
void swap(char s[], int i, int j) {
char temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
void reverse(char s[]) {
int len = strlen(s);
for(int i=0; i<len/2; ++i) {
swap(s, i, len-i-1);
}
}
bool next_permute(char s[]) {
int len = strlen(s);
if(len == 0 || len == 1)
return false;
int j=-1, m=-1;
for(int i=len-2; i>=0; --i)
if(s[i] < s[i+1]) {
j = i;
break;
}
if(j == -1)
return false;
for(int i=len-1; i>j; --i) {
if(s[i] > s[j]) {
m = i;
break;
}
}
swap(s, j, m);
reverse(s+j+1);
return true;
}
int main() {
scanf("%s", s);
int size = strlen(s);
while(next_permute(s))
printf("%s\n", s);
}