給出乙個字串(可能包含字母和數字)給出該字串中字元的所有非重複排列
例子輸入:abc
輸出:abc, acb, bac, bca, cab, cba
1.典型的遞迴方法
例項分析
下面對上述例子字串「abc」進行分析,此時字串長度為3,首字元為『a』。
第一層遞迴:
1『a』與第乙個字元交換,即與本身交換,字串不變為「abc」,首字元依舊為『a』,問題分解為求長度為2的字串「bc」的全排列。
第二層遞迴
1.1『b』與第乙個字元交換,即與本身交換,字串不變為「bc」,首字元依舊為『b』,問題分解為求長度為1的字串「c」的全排列。
第三層遞迴
1.1.1此時字串長度為1,達到遞迴終止條件,輸出當前排列「abc」。
跳出第三層遞迴
第二層遞迴
1.2『b』與第二個字元『c』交換,字串變為「cb」,首字元為』c』,問題分解為求長度為1的字串「b」的全排列。
第三層遞迴
1.2.1此時字串長度為1,達到遞迴終止條件,輸出當前排列「acb「。
跳出第三層遞迴
1.2.2 將序列還原成原來樣子「bc」,如果不這樣的話字串順序會混亂,無法依次交換首字元和後面的字元。
跳出第二層遞迴
2『a』與第二個字元交換,字串不變為「bac」,首字元為『b』,問題分解為求長度為2的字串「ac」的全排列。
後面的可以同理得出…
存在問題
此時當存在相同的字元進行交換時,會出現重複排列,去除重複排列時只需將交換條件設定為不相等時才交換。
如果需要對輸出結果完全按照字母順序排序,則可以使用set儲存結果,直接解決了排序和去除重複兩個問題。
非完全按照字母排序**如下:
vector
permutation(string str)
void core(string &str, string::iterator strit)
}}
2.字典序方法(非遞迴)
每個排列可看作成乙個字串,要求前後兩個字串之間有盡可能長的共同字首,避免了遞迴,更為高效,stl 中next_permutation、prev_permutation等函式就使用了這種演算法,具體講解和**可以參考《stl原始碼解析》p380~383,這裡就不贅述了。
但是這種演算法依然無法避免出現重複序列問題,為了解決這種問題可以使用set解決,去掉重複項。
字串全排列演算法
字典序全排列演算法
演算法15 字串的全排列
題 目 輸入乙個字串,列印該字串的所有排列。例如輸入字串abc,輸出其全排列為abc,acb,bac,bca,cab,cba。思 路 我們想一下,如果不程式設計,手工做的話,我們的基本考慮是 每次首先固定乙個字母,然後讓其餘的字母全排列 然後換乙個字母固定,再全排列其餘的字母,如此迴圈而已。換句話說...
字串全排列演算法
輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba 這是典型的遞迴求解問題,遞迴演算法有四個特性 對於字串的排列問題 如果能生成n 1個元素的全排列,就能生成n個元素的全排列。對於只有乙個元素的集...
演算法 字串全排列演算法
最近在牛客和領扣上刷題,碰到了一些全排列的問題,總結一下。我們首先來看乙個問題?題目 字串的排列 題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。解題思路 使用遞迴的方式來...