题目描述
描述:有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。
示例1:
输入:S = "qqe"
输出:["eqq","qeq","qqe"]
示例2:
输入:S = "ab"
输出:["ab", "ba"]
提示:
字符都是英文字母。
字符串长度在[1, 9]之间。
解题思路
思路1:最直观的想法是,回溯。
void backtracking(vector<string>& res,string& temp,vector<bool>& used,string S,int n)
{
//递归出口
if(temp.size()==n)
{
res.push_back(temp);
return;
}
for(int i=0;i<n;i++)
{
//同一树层相同的跳过并且用过了的不能再用
if(i>0&&S[i]==S[i-1]&&!used[i-1]) continue;
//注意此处和上处条件分开
if(!used[i])
{
temp.push_back(S[i]);
used[i]=true;
backtracking(res,temp,used,S,n);
temp.pop_back();
used[i]=false;
}
}
}
vector<string> permutation(string S)
{
//排序使得重复的元素挨在一起从而方便去重
sort(S.begin(),S.end());
vector<string> res;
string temp;
int n=S.size();
//标记字符是否使用过
vector<bool> used(n,false);
backtracking(res,temp,used,S,n);
return res;
}
总结:如果字符串中的字符无重复,则不用排序;如果字符串中的字符有重复,则需要排序,排序的目的是为了使得重复的元素挨在一起,这样才能利用used数组更好的去重。