描述
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。
输入
输出只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
输出
我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。
=========================================================
递归的思想
大意为:
permute(abc) = a & permute(bc), b & permute(ac), c & permute(ab)
permute(bc) = b & permute(c), c & permute(b)
permute(c) = c
假设字符串为S
permute(string S, int i) { // i 是全排列中已经固定好位置的子字符串长度,从0开始计数
if ( i== S.size )
打印输出 S;
return;
else
for ( j=i ; j<S.size ; j++)
交换S的第i位和第j位; //未固定好位置的子字符串,每个字母依次当首字母
permute( S , i+1 ); //固定的子字符串增加一位
return;
}
========================================================================
AC源代码
#include <iostream>
#include <algorithm>
using namespace std;
void permute(string s, int i) {
if (i >= s.size()) {
cout << s << endl;
return;
}
for (int j=i; j<s.size(); j++) {
swap(s[i], s[j]);
permute(s, i+1);
}
return;
}
int main(){
string s;
cin >> s;
sort(s.begin(),s.end());
permute(s,0);
}