問題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種情況.全排列的過程 選擇第乙個字元 獲得第乙個字元固定下...