class Solution {
private:
vector<string> res;
string cur = "";
public:
vector<string> Permutation(string str) {
if(str.length() == 0){
return {};
}
int n = str.length();
vector<char> rec(n);
for(int i=0; i<n; i++){
rec[i] = str[i];
}
sort(rec.begin(), rec.end());
vector<int> vis(n, 0);
for(int i = 0; i<n; i++){
if(i>0 && rec[i] == rec[i-1]){
continue;
}
dfs(rec, vis, n, i);
}
return res;
}
void dfs(vector<char>& rec, vector<int>& vis, int n, int cur_i){
if(cur.length() >= rec.size()){
return;
}
cur.push_back(rec[cur_i]);
vis[cur_i] = 1;
if(cur.length() == rec.size()){
res.push_back(cur);
}
for(int i=0; i<n; i++){
if(vis[i] == 1){
continue;
}
if(i > 0 && rec[i] == rec[i-1] && vis[i-1] == 0){
continue;
}
dfs(rec, vis, n, i);
}
cur.pop_back();
vis[cur_i] = 0;
}
};