使用遞迴法求字串的全排列問題

2021-10-08 09:21:10 字數 1302 閱讀 5429

對於這個排列,我們是固定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的位置即可。因此,用遞迴...