题目描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
算法思想
进行深度优先搜索,但是要注意可能会有重复的字符,所以要适当的进行“剪枝”。
代码生成
class Solution {
public:
vector<string> res;
vector<string> permutation(string s) {
dfs(s,0);
return res;
}
void dfs(string s, int x) {
if(x == s.size() - 1) { //此时字符串s 中只有一个字符
res.push_back(s); // 添加排列方案
return;
}
set<int> st;
for(int i = x; i < s.size(); i++) {
if(st.find(s[i]) != st.end()) continue; //字母相同时,等效,重复,因此剪枝
st.insert(s[i]);
swap(s[i], s[x]); // 交换,将 s[i] 固定在第 x 位
dfs(s, x + 1); // 开启固定第 x + 1 位字符
swap(s[i], s[x]); // 恢复交换
}
}
};