输入一个字符串(可能有重复字符),输出该字符串中所有字符的全排列。
示例:
输入:s = "abb"
输出:["abb","bab","bba"]
题目来源:LeetCode 剑指 Offer 38. 字符串的排列
思路
- 首先对给定字符串排序,使相同的字符排在一起;
- 利用回溯法,搜索出所有可能的情况;
- 剪枝,如果当前位置的字符和上一位置的字符相同,且上一字符已被选,此情况跳过,实现去重;
- 本篇利用的是位运算记录字符是否被选中。
代码
class Solution {
public:
void dfs(int u, int n, vector<char>& cur, string s, vector<string>& ans, int pos) {
if (u == n) {
string res = "";
for (char c : cur)
res += c;
ans.push_back(res);
return;
}
for (int i = 0; i < n; i ++ ) {
if (i && s[i] == s[i - 1] && (pos >> (i - 1) & 1)) continue; //相同且上一字符被选
if ((pos >> i) & 1) continue; //当前字符被选
cur.push_back(s[i]);
dfs(u + 1, n, cur, s, ans, pos | (1 << i));
cur.pop_back();
}
}
vector<string> permutation(string s) {
sort(s.begin(), s.end());
vector<string> ans;
int n = s.size();
vector<char> cur; //当前已选中的字符
dfs(0, n, cur, s, ans, 0);
return ans;
}
};