递归法
- 使用flag标记数组表示位置是否被占据
- 排序,判断前一个位置为0且字母相同->相同位置已有该字母出现
- 在上一层递归函数结束后,解除占用
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return string字符串vector
*/
void check(vector<string>& vs,vector<int>& flag,string& str,string new_str)
{
if(new_str.size()==str.size())
{
vs.push_back(new_str);
return;
}
for(int i=0;i<str.size();i++)
{
if(flag[i])
{
continue;
}
//前后字母重复
if(i>=1&&str[i-1]==str[i]&&!flag[i-1])
{
continue;
}
flag[i]=1;//被占用
check(vs,flag,str,new_str+str[i]);
flag[i]=0;//解除占用
}
}
vector<string> Permutation(string str) {
// write code here
vector<string> vs;
int len=str.size();
if(!len)
{
return vs;
}
vector<int> flag(len,0);
sort(str.begin(),str.end());
check(vs,flag,str,"");
return vs;
}
};