/*
递归:f(s,pos),从pos开始到字符串末尾进行种类获取
每层递归确定一个字符,注意递归结束要返回原位置,防止重复,错误
用set集合存储自动把重复的删除且排序。
return {}
vector<string>(ret.begin(), ret.end())
insert();
*/
class Solution {
public:
void perm(int pos, string s, set<string> &ret){
if(pos + 1 == s.length()){//遍历到最后一个结束
ret.insert(s);
return;
}
for(int i = pos; i < s.length(); ++i){
swap(s[pos], s[i]);//分别用不同的字母开头输入
perm(pos + 1, s, ret);//对后面字符串进行操作
swap(s[pos], s[i]);//回溯 回复原来字符串为了保证以不同字母开头
}
}
vector<string> Permutation(string s) {
if (s.empty()) return {};
set<string> ret;//递归中不考虑重复,set集合自动删除
perm(0, s, ret);
return vector<string>(ret.begin(), ret.end());
}
};