题目要求
思路
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();}}
};