劍指offer 面試題38 字串的排列

2021-08-04 12:36:41 字數 1451 閱讀 9925

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

ps:輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

其實就是對字串全排列,然後放到 treeset 中。

放到treeset中解決了兩個問題:1.去掉重複字串,2.按字典序排序

這裡講一下全排列:

1.字串 「a」 的全排列就是自身

2.字串 「ab」 的全排列是 「ab」, 「ba」

3.字串 「abc」 的全排列是 「abc」, 「acb」, 「bac」, 「bca」, 「cab」, 「cba」,即:

第乙個字元為a,加上 「bc」 的全排列;

第乙個字元為b,加上 「ac」 的全排列;

第乙個字元為c,加上 「ab」 的全排列。

即字串的全排列,等於所有可能的首字元,加上剩下的字元的全排列的組合。

然後再去求解剩下的字元的全排列,這個就變成了子問題。所以用遞迴求解。

/**

* 題目:

* 輸入乙個字串,按字典序列印出該字串中字元的所有排列。

* 例如輸入字串abc, 則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

* ps:輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

* *@author peige

*/public

class

_38_stringpermutation

private

void

permutation(char chars, int index)

for(int i = index; i < chars.length; ++i)

}private

void

swap(char chars, int indexa, int indexb)

}

public

class

_38_test

/*** 功能測試

* 1.有重複字元

* 2.無重複字元

*/private

static

void

test1()

/*** 邊界測試

* 1.只有乙個字元

* 2.有多個重複字元

*/private

static

void

test2()

/*** 極端測試

* 1.輸入null

* 2.輸入的字串內容為空

*/private

static

void

test3()

}

劍指Offer 面試題38 字串的排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。思路 遞迴思路。迴圈固定第乙個位置字母,則後面的排序數等於其餘字元的排序。對其餘字元也一樣進行這樣的操作。最後使用set去重,並排序。...

《劍指offer》面試題38 字串的排列

思路 1.我們求整個字串的排列,可以看成兩步 首先求出所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。2.第二步固定第乙個字元,求後面所有字元的排列。這個時候我們仍把後面的所有字元分成兩部分 後面字元的第乙個字元,以及這個字元之後的所有字元。然後把第乙個字元逐一和它後面的字元交換...

劍指offer 面試題38 字串的排列

我慣用的dfs模板直接拿來套 class solution int n str.size vector res vector visited n,false string cur sort str.begin str.end dfs res,visited,cur,str return res vo...