剑指offer题目27:字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解答思路
看了大佬的解析才懂怎么做。。利用递归的思路,首先是把第1个字符和后面的依次交换得到新的字符串,然后到第2个和后面的交换,直到到达终点。

可以使用递归的思路去做,主注意的是题目有两个限制,1个是字符会重复,第二个是需要按照字典序输出
实现代码
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
Permutation(str, result, 0);
// 要求按照字典序来输出,所以还是先排一下序
sort(result.begin(),result.end());
return result;
}
void Permutation(string str, vector<string>& result, int begin) {
if(begin == str.size() - 1) {
// 防止aa交换成aa,查找一遍结果集没有才加进去
if(find(result.begin(), result.end(), str) == result.end()) {
result.push_back(str);
}
} else {
for (int i = begin; i < str.size(); ++i)
{
swap(str[i], str[begin]); // 交换起始数和后面的数
Permutation(str, result, begin + 1); // 继续交换后面的起始和后面的数
swap(str[i], str[begin]); // 复位
}
}
}
void swap(char& a, char& b) {
char temp = a;
a = b;
b = temp;
}
};
作者:大傻逼
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号