题意:
输入一个长度为 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; } } } };
时间复杂度:空间复杂度: