劍指offer 面試題38 字串的排列

2021-10-02 15:34:03 字數 1376 閱讀 8789

我慣用的dfs模板直接拿來套

class solution ;}

int n=str.

size()

; vector res;

vector

visited

(n,false)

; string cur="";

sort

(str.

begin()

,str.

end())

;dfs

(res,visited,cur,str)

;return res;

}void

dfs(vector

& res,vector

& visited,string& cur,

const string& str)

int last_i=-1

;for

(int i=

0;isize()

;++i)

else

if(last_i==

-1 or str[i]

!=str[last_i])}

}};

劍指offer書上的方法,每次只考慮當前位,比如index。對於index取不同的值(將index之後的值和index做交換),之後對index+1進行遞迴。最後輸出前需要排序為字典序,因為這種方法生成的字串不是有序的。

class solution 

void

permutation

(vector

&array, string& str,

int begin)

//遍歷第begin位的所有可能性

for(

int i=begin; i<=str.

size()

-1;i++

)swap

(str[i]

, str[begin]);

//當i==begin時,也要遍歷其後面的所有字元;

//當i!=begin時,先交換,使第begin位取到不同的可能字元,再遍歷後面的字元

permutation

(array, str, begin+1)

;//遍歷其後面的所有字元;

swap

(str[i]

, str[begin]);

//為了防止重複的情況,還需要將begin處的元素重新換回來

/*舉例來說「abca」,為什麼使用了兩次swap函式

交換時是a與b交換,遍歷;

交換時是a與c交換,遍歷;(使用一次swap時,是b與c交換)

交換時是a與a不交換;

*/}}

};

劍指offer 面試題38 字串的排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。ps 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。其實就是對字串全排列,然後放到 treeset 中。放到tre...

劍指Offer 面試題38 字串的排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。思路 遞迴思路。迴圈固定第乙個位置字母,則後面的排序數等於其餘字元的排序。對其餘字元也一樣進行這樣的操作。最後使用set去重,並排序。...

《劍指offer》面試題38 字串的排列

思路 1.我們求整個字串的排列,可以看成兩步 首先求出所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。2.第二步固定第乙個字元,求後面所有字元的排列。這個時候我們仍把後面的所有字元分成兩部分 後面字元的第乙個字元,以及這個字元之後的所有字元。然後把第乙個字元逐一和它後面的字元交換...