今天要写的题目是剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
万物皆可暴力,但是时间复杂度太高了,因此我们可以考虑dfs和回溯算法
需要注意的是如果给出了的字符串有重复字符,则需要剪枝操作。
下面为回溯的代码
class Solution {
public:
vector<string> ans;
vector<string> permutation(string s) {
dfs(s,0);
return ans;
}
void dfs(string& s,int index){
if(index >= s.size()){
ans.push_back(s);
return ;
}
for(int i=index;i<s.size();i++){
if(judge(index,i,s)){
continue;
}
swap(s[i],s[index]);
dfs(s,index+1);
swap(s[i],s[index]);
}
}
bool judge(int begin,int end,string& s){
for(int i=begin;i<end;i++){
if(s[end] == s[i])
return true;
}
return false;
}
};
dfs算法的套路一般是
dfs(答案容器,本次地址,条件容器)
1.开头时判断本次地址是否到达边境条件,如果到达将值写入容器中结束本次调用
2.使用循环,变量从0到条件容器的空间大小
3.进行某种操作
4.递归调用dfs(答案容器,本次地址+1,条件容器)
5.将上面的操作撤销