全排列
題目描述
給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字符串中的字母已經按照從小到大的順序排列。
輸入描述:
輸入只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在1到6之間。
輸出描述:
輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。
輸入
abc
輸出
abc acb bac bca cab cba
使用STL標準庫函數
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
sort(str.begin(),str.end());
do{
cout << str << endl;
}while(next_permutation(str.begin(), str.end()));
cout << endl;
}
return 0;
}
使用遞歸
//算法思想:全排列的n皇后問題思路,對問題進行遞歸實現。
#include <iostream>
#include <string.h>
#include <algorithm>
#define max 7
using namespace std;
//P爲當前排列,hashTable記錄x是否已經在p中
int n; //n爲字符串長度,當前處理排列的index位
int hashTable[max] = {0};
char p[max]; //儲存全排列結果的數組
void generateP(int index,char str[])
{
if(index == n) //遞歸邊界
{
for(int i=0;i<n;++i)
{
cout << p[i]; //輸出當前排列
}
cout << endl;
return;
}
for(int x=0;x<n;++x)
{
if(hashTable[x] == 0) //如果x不在p[0]~p[index-1]中
{
p[index] = str[x]; //令p的index位爲先,即把str[x]加入當前排列
hashTable[x] = 1; //記x已經在p中
generateP(index+1,str); //處理排列的index+1位,index會從 0 增加到 n
hashTable[x] = 0; //已處理完p[index]爲x的子問題,還原狀態
}
}
}
int main(int argc, char const *argv[])
{
char str[max];
while(cin >> str)
{
n = strlen(str);
sort(str,str+n);
generateP(0,str);
cout << endl;
}
return 0;
}