剑指 Offer 38. 字符串的排列https://leetcode.cn/problems/zi-fu-chuan-de-pai-lie-lcof/
难点在于 可能出现重复的元素、这样直接求排列也会出现重复的结果
- 要去除重复的结果,只要先排序、让相同的字母挨在一起,
- 然后让相邻相同的元素按序遍历即可、只取按序遍历的结果、其他遍历结果都是重复的
string path;
vector<bool> used;
vector<string> res;
void backTrack(string& s)
{
// base case
if (path.size() == s.size())
{
res.push_back(path);
return;
}
for (int i = 0; i < s.size(); ++i)
{
// 去除出现重复的情况
if (i > 0 && s[i] == s[i - 1] && !used[i - 1])
{
continue;
}
if (!used[i])
{
path.push_back(s[i]);
used[i] = true;
backTrack(s);
path.pop_back();
used[i] = false;
}
}
}
vector<string> permutation(string s) {
int n = s.size();
used.resize(n);
// 先排序,让相同的字母挨在一起
sort(s.begin(), s.end());
backTrack(s);
return res;
}