题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:首先字符串各个的元素和首元素交换位置,保证每个元素都在第一个位置出现, 然后递归求解,最后把交换的元素再次交换, 避免结果的重复。
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> svec;
int length = str.size();
if (length <= 0)
return svec;
PermutationCore(str, svec, 0, length - 1);
sort(svec.begin(), svec.end());
return svec;
}
void PermutationCore(string str, vector<string>& svec, int p, int q)
{
if (p == q)
{
auto it = find(svec.begin(), svec.end(), str);
if (it == svec.end())
svec.push_back(str);
return;
}
for (int i = p ; i <= q; ++i)
{
swap(str[i], str[p]);
PermutationCore(str, svec, p + 1, q);
swap(str[i], str[p]);
}
}
};