解題筆記(21) 字串的排列組合問題

2021-06-18 19:15:54 字數 1424 閱讀 1649

問題1 :輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab和cba。

思路:這是個遞迴求解的問題。遞迴演算法有四個特性:(1)必須有可達到的終止條件,否則程式將陷入死迴圈;(2)子問題在規模上比原問題小;(3)子問題可通過再次遞迴呼叫求解;(4)子問題的解應能組合成整個問題的解。

對於字串的排列問題。如果能生成n - 1個元素的全排列,就能生成n個元素的全排列。對於只有1個元素的集合,可以直接生成全排列。全排列的遞迴終止條件很明確,只有1個元素時。下面這個圖很清楚的給出了遞迴的過程。

參考**:解法1通過permutation_solution1(str, 0, n); 解法2通過呼叫permutation_solution2(str, str)來求解問題。

[cpp]view plain

copy

print?

//函式功能 : 求乙個字串某個區間內字元的全排列

//函式引數 : pstr為字串,begin和end表示區間

//返回值 :   無

void permutation_solution1(char *pstr, int begin, int end)  

else

}  }  //函式功能 : 求乙個字串某個區間內字元的全排列

//函式引數 : pstr為字串,pbegin為開始位置

//返回值 :   無

void permutation_solution2(char *pstr, char *pbegin)  

else

}  }  //提供的公共介面

void permutation(char *pstr)    

//函式功能 : 求乙個字串某個區間內字元的全排列

//函式引數 : pstr為字串,begin和end表示區間

//返回值 : 無

void permutation_solution1(char *pstr, int begin, int end)

//選擇這個元素

result.push_back(*pstr);  

combination_m(pstr + 1, m - 1, result);  

result.pop_back();  

//不選擇這個元素

combination_m(pstr + 1, m, result);  

}  //函式功能 : 求乙個字串的組合

//函式引數 : pstr為字串

//返回值 :   無

void combination(char *pstr)  

}  本文出自:

字串排列組合

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。題目分析 考慮把這個複雜的問題分解成為小的問題。整個字串的排列,可以看成兩個部分 首先,求所有可能出現在第乙個位置的字元 然...

字串排列組合

1 字串的組合 子串行 題目 輸入乙個字串,輸出該字串中字元的所有組合。例子 輸入 abc,它的組合有 a b c ab ac bc abc 分析 我們可以將字串中的每個字元看成二叉樹的乙個節點,根節點為空,每個節點都會有兩種選擇 要 和 不要 兩種選擇 那麼我們就可以利用遞迴實現。public c...

字串的排列 組合

遞迴方法 1 全排列 面試題28 字串的排列 從集合依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理 n個數的全排列,一共有n!種情況.n個位置,第乙個位置有n種,當第乙個位置固定下來之後,第二個位置有n 1種情況.全排列的過程 選擇第乙個字元 獲得第乙個字元固定下...