剑指offer—字符串的排列
题目详情
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
思路
当没有重复字符时,可以遍历每一个字符,并且和当前字符往后的字符两两交换并递归,递归结束时再交换回来
但因为题目要求是里面不能有重复数组,玩意字符串是aabc,那么就会出现重复的数,于是用集合来存储值,最后再将set转化为vector
代码
void dfs(string s, set<string>& res, int level){
if(level == s.size()){
res.insert(s);
return;
}
for(int i = level; i < s.size(); i++){
swap(s[i], s[level]);
dfs(s, res, level+1);
swap(s[i], s[level]);
}
}
vector<string> permutation(string s) {
//用集合去重
set<string> res;
dfs(s, res, 0);
//将集合转为vector
return vector<string>(res.begin(), res.end());
}