問題描述:全排列:給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字符串中的字母已經按照從小到大的順序排列。
作者:學長
時間:2017年5月23日
輸入:輸入只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在1到6之間。
輸出:輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。字母序如下定義:
作者:學長
時間:2017年5月23日
輸入:輸入只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在1到6之間。
輸出:輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。字母序如下定義:
已知S = s1s2...sk , T = t1t2...tk,則S < T 等價於,存在p (1 <= p <= k),使得 s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。
代碼學習心得:使用遞歸和循環依次訪問數組內元素,在遞歸遞和歸的過程中實現數組元素訪問的打表,爲毛我就沒想出來這樣的代碼
代碼:
/*
問題描述:全排列:給定一個由不同的小寫字母組成的字符串,輸出這個字符串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字符串中的字母已經按照從小到大的順序排列。
作者:學長
時間:2017年5月23日
輸入:輸入只有一行,是一個由不同的小寫字母組成的字符串,已知字符串的長度在1到6之間。
輸出:輸出這個字符串的所有排列方式,每行一個排列。要求字母序比較小的排列在前面。字母序如下定義:
已知S = s1s2...sk , T = t1t2...tk,則S < T 等價於,存在p (1 <= p <= k),使得 s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。
*/
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char str[7];
void f(int x)
{
if(x==strlen(str))
{
cout<<str<<endl;
return ;
}
for(int j=x;j<strlen(str);j++)
{
swap(str[j],str[x]);
f(x+1);
swap(str[j],str[x]);
}
}
bool vis[7];//記錄是否訪問過
char t[7];//該數組用於存儲將要輸出的全排列結果
/*void f(int x)
{
if(x==strlen(str))
{
cout<<t<<endl;
return ;
}
for(int i=0; i<strlen(str); i++)
{
if(vis[i])
{
t[x]=str[i];
vis[i]=false;//表示該位置被訪問過
f(x+1);
vis[i]=true;//將遞歸結束,將對應位置的訪問記錄重初始化爲true
}
}
}*/
int main()
{
cin>>str;
memset(vis,true,7*sizeof(bool));//初始化vis數組,將其所有值初始化爲true
f(0);
return 0;
}
程序運行結果展示:
知識點總結:遞歸和循環
學習心得:大神級的代碼。。