剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
思路:
在这里插入代码片
这就是全排列问题 (还有个叫做组合问题)
class Solution {
private:
vector<string> ret_v;
void dfs(string s, int N,string tempt_v,vector<bool> &usd,int index)
{
//cout<<"进来了"<<endl;
if(index==N)//已经有N个元素了
{
cout<<"tempt_v="<<tempt_v.c_str()<<endl;
ret_v.push_back(tempt_v);
return ;
}
for(int i=0;i<N;i++)
{
//同层剪树
if(i>0&&s[i]==s[i-1]&&usd[i-1]==false) continue;
if(usd[i]==true) continue;
usd[i]=true;//这个是需要回溯的
dfs(s,N,tempt_v+s[i],usd,index+1);
usd[i]=false;
}
}
public:
vector<string> permutation(string s)
{
int N=s.size();;
int index=0;
string tempt_v="";
sort(s.begin(),s.end());
vector<bool> usd(s.size(),false);//保存每次是否访问过。
dfs(s,N,tempt_v,usd,index);
return ret_v;
}
};