對於這個排列,我們是固定a不動,然後交換b與c,從而得到"abc" 和 「acb」
同理,對於"bac"、「bca」 、"cab"和"cba"是同樣道理
遞迴三部曲:
遞迴函式的功能:dfs(int pos, string s), 表示固定字串s的pos下標的字元s[pos]
遞迴終止條件:當pos+1 == s.length()的時候,終止,表示對最後乙個字元進行固定,也就說明,完成了一次全排列
下一次遞迴:dfs(pos+1, s), 很顯然,下一次遞迴就是對字串的下乙個下標進行固定
但是,對於"abb"來說,就會有重複,如圖
所以,我們用set可以進行去重,並且可以達到按字母順序排序。
1&f=discussion
class
solution
// for迴圈和swap的含義:對於「abc」,
// 第一次'a' 與 'a'交換,字串為"abc", pos為0, 相當於固定'a'
// 第二次'a' 與 'b'交換,字串為"bac", pos為0, 相當於固定'b'
// 第三次'a' 與 'c'交換,字串為"cba", pos為0, 相當於固定'c'
for(
int i = pos; i < s.
length()
;++i)
} vector<
string
>
permutation
(string s)
;set
<
string
> ret;
perm(0
, s, ret)
;return
vector
<
string
>()
;}};
以上是牛客的題解,對於不清楚的地方我詳細說一下。
整個遞迴函式求的是字串的全排列,這是沒有異議的。
題解中「固定」的意思是,把所求字串中的乙個字元拿出來,放在開頭,如把abcdefg中的d拿出來放在開頭,就變成「d abcefg」,那麼我們求解abcdefg的全排列就可以分解出乙個分支是求子問題「abcefg」的全排列問題。
在**的for迴圈中,就是依次將字串中的字元提取出來,放在開頭,就可以把大問題化解成許多求子字串的小問題進行求解。
還有就是重複問題,題解用了set這個容器進行儲存以解決此問題。我對stl容器還不是很了解,貌似是set可以實現自動對裡邊的內容進行排序。
遞迴 字串全排列 全排列
在高中階段我們已經通過大量的習題了解了排列和組合。但是有時候我們研究的不是由排列和組合算出來的數字,研究的是生成排列和組合。即,把集合中元素所有的排列和組合全部列出來,然後研究這些序列的性質。今天我用兩種方法講一下如何生成排列。注意我們這裡涉及的順序都是序列的字典序。序列的字典序 設有兩個序列,第乙...
遞迴法 元素全排列問題
問題描述 設r 時要進行排列的n個元素 不考慮相等情況 寫出乙個演算法,列出r的所有不同排列。演算法設計 給定n及待排列的n個元素。計算出這n個元素的所有不同排列。演算法思路 設r 是要進行排列的n個元素,r i r 集合x中元素的全排列標記為perem x r i perem x 表示在全排列pe...
求字串全排列
q 輸入乙個字串,列印出該字串中字元的所有排列 a 以abc為例,我們首先將a固定在第一位,然後排列bc,當bc排列完成後,我們會將b固定在第一位,也就是交換a和b的位置,變成bac,然後排列ac,當ac排列完成後,我們需要將c固定在第一位,先將a和b的位置復原,在交換a和c的位置即可。因此,用遞迴...