题意:
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
方法:
递归回溯
递归回溯
思路:![]()
根据如上图解进行递归回溯。
首先,对字符串排序(剪枝要用到的条件);
然后,按照图解递归回溯。
重点:剪枝,实现字符串含有相同字符时的去重效果。
if(i>0&&s[i]==s[i-1]&&vis[i-1]==0)//剪枝 continue;
解释:对字符串排序,如果当前字符与前一个字符相同,并且前一个字符未访问过,则跳过。
class Solution {
public:
int vis[15]={0};//判断是否访问过
int len;
vector<string> res;
vector<string> Permutation(string str) {
len=str.size();
sort(str.begin(),str.end());//字符串排序
dfs(str,"");//递归回溯
return res;
}
void dfs(string s,string x){//递归回溯
if(x.size()==len){
res.push_back(x);
return;
}
for(int i=0;i<len;i++){
if(i>0&&s[i]==s[i-1]&&vis[i-1]==0)//剪枝
continue;
if(vis[i]==0){//如果没有访问过,则访问
vis[i]=1;
dfs(s,x+s[i]);
vis[i]=0;
}
}
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号