输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
分析:
做排列问题需要注意给的字符串或数组是否允许包含重复元素,本题是允许包含重复元素的,区别于力扣的46题,在这里通过一个used数组来标记哪些元素使用过,避免一个元素使用多次(剪枝),再得到方案时在用unordered_map的自动去重机制过滤掉重复的组合(如给定s = “aab”, 从第一个a递归下去会有aab, 从第二个a递归下去也有aab,如果题目不包含重复元素,则不会出现这种问题)
ps:unordered_map的实现为哈希表,速度优于用红黑树实现的map。
class Solution {
public:
vector<string> v;
string tempS;
unordered_set<string> ss;
void backtracking(string& s, vector<bool>& used){
if(tempS.size() == s.size()){
if(ss.find(tempS) != ss.end()) return;
else{
ss.insert(tempS);
v.push_back(tempS);
return;
}
}
for(int i = 0; i < s.size(); i++){
if(used[i] == true) continue;
used[i] = true;
tempS.push_back(s[i]);
backtracking(s, used);
tempS.pop_back();
used[i] = false;
}
}
vector<string> permutation(string s) {
vector<bool> used(s.size(), false);
backtracking(s, used);
return v;
}
};