剑指 Offer 38. 字符串的排列
写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点
1.回溯+set去重 1
- 解题步骤
class Solution {
unordered_set<string> st;//
public:
vector<string> permutation(string s) {
vector<string> res;
if (s.empty()) return res;
dfs(s, 0, res);
return res;
}
void dfs(string &s, int i, vector<string> &res) {
if (i == s.size()) {
if (st.count(s) == 0) {
res.push_back(s);
st.insert(s);
}
return;
}
for (int j = i; j < s.size(); ++j) {
swap(s[j], s[i]); // 第一个字符和后面所有字符交换
dfs(s, i + 1, res); // 求后面字符所有排列
swap(s[j], s[i]); // 回溯
}
}
};
2.回溯+不是set版去重
- 解题步骤
class Solution {
public:
vector<string> permutation(string s) {
vector<string> res;
dfs(res,s,0);
return res;
}
void dfs(vector<string> &res,string &s,int pos){
if(pos == s.size())
res.push_back(s);
for(int i=pos;i<s.size();i++){
bool flag = true;
for(int j = pos;j<i;j++)//字母相同时,等效,剪枝
if(s[j] == s[i])
flag = false;
if(flag){
swap(s[pos],s[i]);
dfs(res,s,pos+1);
swap(s[pos],s[i]);
}
}
}
};
时间复杂度/空间复杂度分析/面试场景如何作答
面试场景
-
不同情形的解题方式
-
时间空间复杂度