1. 程式人生 > >26、字串的排列

26、字串的排列

題目描述:

  輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串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]); } } };