题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路
以 abc
为例:
(1)将字符串分为两个部分,首元素以及剩余元素;
(2)将首元素不断和其他元素进行交换;
(3)以剩余元素组成的字符串内进行递归全排列;
(4)直到交换到最后一个元素,输出当前排列;
注意:
(1)重复元素需要跳过,否则会输出重复排列
(2)在得到子串的全排列后,需要将交换的元素恢复
代码
class Solution {
public:
vector<string> Permutation(string str) {
if (str.empty())
return vector<string>();
if (str.size()==1)
return vector<string> {str};
vector<string> res;
PermutationCore(str,0,res);
// 按字典序排列
sort(res.begin(),res.end());
return res;
}
void PermutationCore(string str ,int begin, vector<string> &res) {
if (begin >= str.size()){
res.push_back(str);
return;
}
for (int i = begin; i < str.size(); ++i) {
// 如果出现重复元素;跳过
if (str[begin] == str[i] && begin!=i){
continue;
}
// 将首元素和后面元素交换
char tmp = str[begin];
str[begin] = str[i];
str[i] = tmp;
PermutationCore(str,begin+1,res);
// 将交换恢复
tmp = str[begin];
str[begin] = str[i];
str[i] = tmp;
}
}
};