题目描述:
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
解题思路:
我们可以把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。在下图中,我们用两种不同的背景颜色区分字符串的两部分。
1. 把字符串分为两部分,一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符(有阴影背景的区域)。
2. 接下来我们求阴影部分的字符串的排列,拿第一个字符和它后面的字符逐个交换。
Demo:
class Solution {
public:
set<string> ans; // 用set去重
vector<string> Permutation(string str) {
vector<string> vecout;
if (str != "")
{
fun(str, 0, str.size());
for (auto tmp : ans)
vecout.push_back(tmp);
}
return vecout;
}
void fun(string &str, int start, int len)
{
//当start==arr.length-1时,说明子序列的长度为1,就不用再往下划分子序列了
if (start == len)
ans.insert(str);
for (int i = start; i < len; i++)
{
swap(str[start], str[i]);
fun(str, start + 1, len);
swap(str[start], str[i]);
}
}
};