(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方法產生引數序列的下乙個字典序列,返回值...