描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
示例1
输入:
"ab"
返回值:
["ab","ba"]
思路:这题考虑将原问题分解成两个子问题,即把一个字符串看成是两个部分组成,第一部分为第一个字符,第二部分为第一个字符后面的所有字符。对于整个字符串的排列,可以分为两步来进行,第一步求出所有可能出现在第一个位置的字符,也就是把第一个字符分别和后面的每一个字符进行交换,然后第二步就是固定第一个字符,求后面的所有字符,同样把后面的字符分为两部分来进行,原理和前面计算的一样,这样就是分解成了不同规模的子问题,解决办法是一样的,就可以尝试用递归的方式去解决。
具体的过程如下:
(1)abc->bac->cba, a分别和后面的每一个字符进行交换;
(2)对于bc,再采用前面的方式进行处理,bc->cb 即原来字符串变为abc->acb。
代码如下:
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
if(str.size() == 0) return result;
permutation(str, result, 0);
return result;
}
void permutation(string str, vector<string> &result, int begin)
{
if(begin == str.size()-1)
{
result.push_back(str);
}
else
{
for(int i = begin; i < str.size(); i++)
{
if(i != begin && str[i] == str[begin])
continue;
swap(str[i], str[begin]);
permutation(str, result, begin+1);
}
}
}
};