输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:1 <= s 的长度 <= 8
思路
深搜回溯。
答案
class Solution {
private:
vector<string> ret;
void findRet(string s,int x) {
if(x==s.size()-1) {
ret.push_back(s);
return;
}
unordered_map<char,bool> umap;
for(int i=x;i<s.size();i++) { //依次使用当前字符
if(umap.find(s[i])!=umap.end())
continue; //重复
umap.insert(make_pair(s[i],true));
swap(s[i],s[x]); //交换 将s[i]固定在x位
findRet(s,x+1);
swap(s[i],s[x]); //恢复状态
}
}
public:
vector<string> permutation(string s) {
findRet(s,0); //x=0表示扫描到哪个位置
return ret;
}
};