字串全排列

2021-07-09 11:11:21 字數 938 閱讀 8529

public class birotest else ;

permutation(buf, 0, 2);

用樹的結構能夠加強對這個遞迴的理解,但是如果一開始畫的時候很容易將紅色的b那個節點與右邊a換掉。一開始看這種for迴圈,覺得很繞,尤其debug或者自己慢慢逐個語句檢視的時候,很容易被for迴圈繞暈,尤其當字串為abcd或者更大的時候。先對這個遞迴進行整體的介紹,分3步:1交換,2遞迴,3恢復。其中第3步很容易被忽略掉,在每個遞迴返回時候,需要恢復遞迴呼叫前的狀態。出口是游標都指到字串最後乙個元素(即到了圖的葉子節點)

每輸出一組,就要恢復一下(跳出for迴圈),例如第一組abc,恢復bc,之前都指向b的並沒有交換,但事實上,**上是走的,第二組輸出的時候cb,恢復至bc,此時buf為abc(此次恢復實際上跳出一層for迴圈);然後開始a和b交換,即bac;依次類推,到第4組的時候輸出bca,先恢復ac,即buf為bac,然後再恢復至abc(跳出一層for迴圈),接著交換成cba。

如果字串為abcd時候,和這個類似(大問題劃分成小問題,整體上還是3步:1.交換,2:遞迴,3:恢復),先po結果abcd

abdc

acbd

acdb

adcb

adbc

bacd

badc

bcad

bcda

bdca

bdac

cbad

cbda

cabd

cadb

cdab

cdba

dbca

dbac

dcba

dcab

dacb

dabc

每一組相當於之前的3個字串,在之前3層樹的基礎上往上再畫一層。

遞迴 字串全排列 全排列

在高中階段我們已經通過大量的習題了解了排列和組合。但是有時候我們研究的不是由排列和組合算出來的數字,研究的是生成排列和組合。即,把集合中元素所有的排列和組合全部列出來,然後研究這些序列的性質。今天我用兩種方法講一下如何生成排列。注意我們這裡涉及的順序都是序列的字典序。序列的字典序 設有兩個序列,第乙...

字串全排列

依次選出每乙個字元元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。以對字串abc進行全排列為例,我們可以這麼做 固定a,求後面bc的排列 abc,acb,求好後,a和b交換,得到bac 固定b,求後面ac的排列 bac,bca,求好後,c放到第一位置,...

字串全排列

如果沒有重複字元 include using namespace std void swap char char void permutation char char int main void swap char a,char b str 整個串 pbegin 後面的字串拉到前面的起始位置 voi...