文章内容为LeetCode刷题笔记,如发现错误请多多指教
22、字符串的排列问题:全排列问题,DFS
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
全排列问题可以看做如下多叉树形态:
很明显,如果我们想要得到合适的排列,我们要用到深度优先遍历,该问题可以把目标串分成两个部分,第一部分呢是哪个字符作为开头,第二部分就是该字符做开头的子部分,所以让所有的字符做一遍开头,再求解子问题就可以了。
class Solution {
public:
void swap(string &s,int i,int j){
char temp = s[i];
s[i]=s[j];
s[j]=temp;
}
bool isExist(vector<string> &result,string &s){
auto it=result.begin();
for(;it!=result.end();++it){
if(*it==s){
return true;
}
}
return false;
}
void permutationHelper(string &s,int start,vector<string> &result){
if(start==s.length()-1){
if(!isExist(result,s)){
result.push_back(s);
}
return ;
}
for(int i=start;i<(int)s.size();i++){
swap(s,start,i);
permutationHelper(s,start+1,result);
swap(s,start,i);
}
}
vector<string> permutation(string s) {
vector<string> result;
if(s.length()>0){
permutationHelper(s,0,result);
sort(result.begin(),result.end());
}
return result;
}
};