剑指 Offer 38 字符串的排列
概述
https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/
回溯法
排列问题,难点在于如何避免重复项的出现。
为了避免重复项,我们做选择的时候,如果一个字符已经被选了,则不要再选了。
用哈希表非常合适!
class Solution {
public:
vector<string> ans;
int n;
vector<string> permutation(string s) {
n = s.size();
unordered_map<char, int> m;
for (auto c : s) m[c] ++;
string path;
backtrack(m, path);
return ans;
}
void backtrack(unordered_map<char, int>& m, string& path) {
if (path.size() == n) {
ans.push_back(path);
return;
}
for (auto iter = m.begin(); iter != m.end(); ++ iter) {
if (iter->second != 0) {
m[iter->first] --;
path.push_back(iter->first);
backtrack(m, path);
path.pop_back();
m[iter->first] ++;
}
}
}
};
Links: sword-offer-38