解题思路:
(1)使用回溯法求得全排列,注意重复字母的情况
(2)当遇到非自身相同的字母时,跳过交换和排列
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> v;
permute(v,str,0,str.length()-1);
sort(v.begin(),v.end());
return v;
}
void permute(vector<string> &v,string &a, int l, int r) {
if (l == r) v.push_back(a);
else {
for (int i = l; i <= r; i++) {
if(a[l]!=a[i]||i==l) {
swap(a[l], a[i]);
permute(v,a, l+1, r);
swap(a[l], a[i]);
}
}
}
}
};
(3)如果不想使用判断,重复字母,可以使用set(集合)
(4)不过牛客网上有人嘲讽我这种STL写法,哈哈哈
(5)其实,要想锻炼基本功,可以去用C语言来做题,哈哈哈
class Solution {
public:
vector<string> Permutation(string str) {
set<string> s;
sort(s.begin(),s.end());
do { s.insert(str); } while (next_permutation(str.begin(),str.end()));
vector<string> v(s.begin(),s.end()),b;
return str.length()==0?b:v;
}
};