字串排列和組合的問題

2021-06-29 16:07:39 字數 1562 閱讀 4633

1、題目:輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc

,則輸出由字元a

、b、c

所能排列出來的所有字串abc

、acb

、bac

、bca

、cab

和cba

。解決方法:遞迴,分成第乙個字元和後面部分的字元。先分析所有第乙個字元的情況,然後固定第乙個字元,遞迴求出後面n-1個字元

void permutation(char* pstr, char* pbegin);

/// get the permutation of a string,

// for example, input string abc, its permutation is

// abc acb bac bca cba cab

/void permutation(char* pstr)

/// print the permutation of a string,

// input: pstr - input string

// pbegin - points to the begin char of string

// which we want to permutate in this recursion

/void permutation(char* pstr, char* pbegin)

// otherwise, permute string

else

}}

2、

如果不是求字元的所有排列,而是求字元的所有組合,應該怎麼辦呢?當輸入的字串中含有相同的字串時,相同的字元交換位置是不同的排列,但是同乙個組合。舉個例子,如果輸入abc

,它的組合有a、b、c、ab、ac、bc、abc

。解法分析:問題簡化成求n個字元的長度為m的組合,同樣的吧n個字元分成兩個部分:第乙個字元和其餘的所有字元。如果組合裡包含第乙個字元,則下一步在剩餘的字元裡選取m-1個字元;如果組合裡不包含第乙個字元,則下一步在剩餘的n-1個字元裡選取m個字元。然後兩個子問題用遞迴的方法來解決。

void perm(string s, int m, vector&result)

cout << endl;

return;

} if ( s.empty() )

result.push_back(s[0]);

perm(s.substr(1, s[s.size() - 1]), m - 1, result);

result.pop_back();

perm(s.substr(1, s[s.size() - 1]), m, result);

}void combination(string s)

int length = s.size();

vectorresult;

for (int i = 1; i <= length; ++i)

不過**中沒有考慮字串中含有空格的情況,即「 1234」或者「12 34」的情況。

字串全排列和組合問題

程式設計思路 如果字串中有n個字元,那麼一共需要輸出2 n 1中組合假設我們想在長度為n的字串中求m個字元的組合。我們先從頭掃瞄字串的第乙個字元。針對第乙個字元,我們有兩種選擇 第一是把這個字元放到組合中去,接下來我們需要在剩下的n 1個字元中選取m 1個字元 第二是不把這個字元放到組合中去,接下來...

字串排列組合問題

一.全排列無重複字元 include include char buf 1024 void func int index void swap int index1,int index2 intmain void func int index else void swap int index1,int...

字串的排列組合問題

問題1 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。思路 這是個遞迴求解的問題。遞迴演算法有四個特性 1 必須有可達到的終止條件,否則程式將陷入死迴圈 2 子問題在規模上比原問題小 3 子...