字串的全排列和組合演算法

2021-07-11 01:19:03 字數 1228 閱讀 2839

今天研究了下字串的全排列和組合問題。

來自《劍指offer》面試題28:字串的排列

題目:輸入乙個字串,列印出該字串中字串的所有排列。

正常情況可以用n重迴圈 ,列印出來 但是這樣**復用程度太低,要根據n寫迴圈的次數。換一種思路可以採用遞迴的思路:

把整個字串的排列分成兩步,首先求雖有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換,然後把後面的字串分成兩部分,第一部分乙個位元組,然後與後面的交換,這樣一看就形成了乙個遞迴:**如下

#includeusing namespace std;

#includevoid permutation(char* pstr, char* pbegin) }}

int main(void)

字串組合問題:

題目:輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。

上面我們詳細討論了如何用遞迴的思路求字串的排列。同樣,本題也可以用遞迴的思路來求字串的組合。

假設我們想在長度為n的字串中求m個字元的組合。我們先從頭掃瞄字串的第乙個字元。針對第乙個字元,我們有兩種選擇:第一是把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選取m-1個字元;第二是不把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選擇m個字元。這兩種選擇都很容易用遞迴實現。下面是這種思路的參考**:

#include#include#includeusing namespace std;

#includevoid combination(char *string ,int number,vector&result);

void combination(char *string)

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

if(*string == '\0')

return ;

result.push_back(*string);

combination(string + 1 , number - 1 , result);

result.pop_back();

combination(string + 1 , number , result);

}int main(void)

C 全排列組合演算法

題目描述 給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。輸入描述 輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。輸出描述 輸出這個字串的所有排列方式,每行乙個排列。...

字串全排列和組合問題

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

字串的全排列與組合

一 字串的排列 問題描述 給出乙個字串,請設計乙個函式輸出所有可能的排列,如abc,可能的排列順序有abc acb bac bca cba cab 問題分析 要對長度為n的序列進行排序,可以轉化為固定第乙個的值,再對剩餘的n 1個進行排序的問題,可以用遞迴實現。由於第乙個的值可以是任何乙個,可用第乙...