title:
一、輸入乙個字串,列印出字串中字元的所有排列
二、列印出字串中字元的所有組合(如ab和ba是兩種排列但是只能算一種組合)
thought:
一:1、將乙個字串分為兩部分:第一部分為第乙個字元,之後的子串屬於第二部分;
2、將第乙個字元依次與後面的字元交換;
3、每交換一次,對新串的第二部分子串進行遞迴的1、2操作;
4、操作完之後,要把交換的兩個字元恢復原位:這樣做是為了避免出現重複的排序;
5、到達字串的最末位截止。
二:n是字串的長度,m是從字串中選取的字元個數(m=1,2,...n)
1、處理字元*str時,有兩種方式:
選中此字元,接著處理下一字元*(str+1),然後m變成m-1;
不選此字元,接著處理下一字元*(str+1),但是m保持不變(因為沒選*str,所以仍然需要從剩餘字元中選取m個);
2、對每個m進行上述處理,m取值從1到n,所以需要呼叫n次步驟1。
注:當n==0 or m== 0時,實現一種組合。
#include#includeusing namespace std;
static int cnt_permunation = 0; //統計全排列的個數
static int cnt_combine = 0; //統計字元的組合數
void string_permunation(char *str);
void permunation(char *str,char *str_begin);//str始終指向完整字串的首字元,str_begin指向當前處理的字串的首字元
void str_combine(char *str);
void combine_recurise(char *str,int m,vector&result);
void string_permunation(char *str)
void permunation(char *str,char *str_begin) //str_begin指向當前處理的子串
else }
}void str_combine(char *str)
}void combine_recurise(char *str,int m,vector&result)
result.push_back(*str); //步驟1:選擇此字元,m-1
combine_recurise(str+1,m-1,result);
result.pop_back(); //將選擇的字元彈出(變成不選此字元的情況)
combine_recurise(str+1,m,result); //步驟1:不選此字元,m不變
}int main()
{ char str="abcd";
cout << str <<"的全排列如下:"<< endl;
string_permunation(str);
cout << "共" <
字串的排列 28
輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。對於乙個字元來說,只有乙個排列就是其自身,那麼對於多個字元的組合來說,也是有規律可循的 可以在字串中選出乙個字元來固定出頭部,比如上述先用a來...
字串的排列 全排列
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。使用itertools中的permutations,可以實現全排列 ...
字串的全排列
題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c 所能排列出來的所有字串 abc acb bac bca cab 和 cba。思路一 遞迴求解 include include include 說明 採用遞迴求解 如求 abc 則先固定a,交換bc 求b,則...