我慣用的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.第二步固定第乙個字元,求後面所有字元的排列。這個時候我們仍把後面的所有字元分成兩部分 後面字元的第乙個字元,以及這個字元之後的所有字元。然後把第乙個字元逐一和它後面的字元交換...