28 列印並統計字串的全排列和組合

2021-07-04 21:01:07 字數 1608 閱讀 8896

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,則...