26、字串的排列
阿新 • • 發佈:2019-01-01
題目描述:
輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串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]);
}
}
};