求字串中字元全排列 和 組合

2021-07-05 10:38:59 字數 2050 閱讀 7684

(1)若不考慮字串中有重複字元(即假設字串中無重複字元)

(2)若考慮字串中有重複字元(即假設字串中有重複字元)

(2)若考慮字串中有重複字元(即假設字串中有重複字元)

上述思路非常好,但是若存在重複字元,則就不正確了,比如對於上述程式,輸入「aabc」,則輸出:

就會出現重複的結果。我本來思考著如果在與*pbegin交換時加乙個條件語句判斷是否相等,若與*pbegin相等就不交換,若不相等才交換,用「aabc」測試時結果確實正確了。但是實際上是錯誤的,比如用「abbc」測試時就不正確了。      我也是看到了乙個網友的方法才發現我上述考慮的方法是錯誤的,他的方法是判斷當前*pch的字元(即準備與*pbegin交換的字元)在前面的子字串中是否出現過了,若出現了,就不交換,若沒出現就交換。**如下:

void permutation(char* psrc,  char* pbegin)

if (*pbegin == '\0')

else

} }}

int main()

執行結果是:

二、字串的組合

(1)若不考慮字串中有重複字元(即假設字串中無重複字元)

輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入"

abc"

,它的組合有a、

b、c、

ab、ac、

bc、abc。

本題也可以用遞迴的思路來求字串的組合。

假設我們想在長度為

n的字串中求

m個字元的組合。我們先從頭掃瞄字串的第乙個字元。針對第乙個字元,我們有兩種選擇:一是把這個字元放到組合中去,接下來我們需要在剩下的

n-1個字元中選取

m-1個字元;而是不把這個字元放到組合中去,接下來我們需要在剩下的

n-1個字元中選擇

m個字元。這兩種選擇都很容易用遞迴實現。下面是這種思路的參考**:

void combination(char* str, int number, vector& result)

if (number==0)

cout

for (int i=1; i<=strlen(psrc); ++i)

return 0;

}

執行結果是:

也可以去掉上述中的迴圈:

void combination(char* str, int number, vector& result)

cout

combination(psrc, strlen(psrc), result);

return 0;

}

另外,看到乙個網友的思路:

用乙個陣列,模擬2進製加法器,某乙個為1,則取對應的字元,若為0則不取,就能夠實現字元組合。這個思路也非常好~ 不過是在

字元長度不超過32的情況下。

(2)若考慮字串中有重複字元(即假設字串中有重複字元)

但是上述**在字串中有重複字元時就出問題了,如輸入」abbc「,則輸出為:

求字串全排列

q 輸入乙個字串,列印出該字串中字元的所有排列 a 以abc為例,我們首先將a固定在第一位,然後排列bc,當bc排列完成後,我們會將b固定在第一位,也就是交換a和b的位置,變成bac,然後排列ac,當ac排列完成後,我們需要將c固定在第一位,先將a和b的位置復原,在交換a和c的位置即可。因此,用遞迴...

字串全排列和組合問題

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

求字串的全排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。利用stl中的next permutation方法可以很快解出來 next permutation方法產生引數序列的下乙個字典序列,返回值...