题目要求
思路
1.因为只涉及到字符,因此可以进行排序
2.创建临时字符串,当临时字符串temp的长度等于str的长度,作为判出条件。
3.创建一个标记的数组,每次在temp中插入一个字符,便在对应的数组下标设置为1,表示该字符已经使用
4.特殊情况处理,如果标记数组中表示这个字符已经使用过,则跳过。如果当前字符没有使用过,但是该字符和前一个字符相同,且前一个字符已经使用过,则也跳过。防止结果中出现两次aab的结果。
代码实现
class Solution {
public:
vector<string> Permutation(string str) {
sort(str.begin(), str.end());
vector<int> vis(str.size(), 0);
vector<string> res;
string temp;
per(res, str, temp, vis);
return res;
}
void per(vector<string> &res, string &str, string &temp, vector<int> &vis)
{
if(str.length() == temp.length())
{
res.push_back(temp);
return;
}
for(int i = 0; i < str.length(); i++)
{
if(vis[i] == 1)
continue;
if(i > 0 && str[i] == str[i-1] && vis[i-1] == 1)
continue;
vis[i] = 1;
temp.push_back(str[i]);
per(res, str, temp, vis);
vis[i] = 0;
temp.pop_back();
}
}
};