劍指38 字串的排列

2021-10-09 11:41:37 字數 1216 閱讀 5565

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

示例

輸入:abc

輸出:abc

acbbac

bcacab

cba有要求排序,則需要將字串所有字元取出生成等長的char陣列並進行排序,再根據排序後的結果選擇字元進行組合;

選擇字元的過程可以用遞迴實現,使用for迴圈進行遞迴呼叫也可以滿足字典序進行組合,那麼這個過程中需要有乙個boolean陣列來標誌該字元是否已被使用;

遞迴終止條件設定為當前組合的字串長度等於char陣列的長度;

遞迴體中使用乙個for迴圈,從排好序的char陣列的第一位開始進行遍歷與組合可以保證字典序。首先應該查詢該位是否使用過,已使用則跳過該字元去遍歷下乙個字元,未使用則更新使用狀態為使用(true),然後將該字元加入組合的串中,接著遞迴呼叫。待遞迴返回後,從串中刪除該字元,將使用狀態更新為未使用(false),達到回溯。

private arraylist

ret =

newarraylist

<

>()

;public arraylist

solute

(string str)

char

chars = str.

tochararray()

; arrays.

sort

(chars)

;back

(chars,

newboolean

[chars.length]

,new

stringbuilder()

);return ret;

}//hasused儲存對應位置的字元使用情況,s儲存當前組合方案

private

void

back

(char

chars,

boolean

hasused,stringbuilder s)

//for迴圈保證按照字典序遍歷組合

for(

int i=

0;i)}

劍指Offer 38 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。例 輸入 abc 輸出 abc acb bac cab cba 長度為n的字串的排列若是集合s,其中一種排列的字串為 s2,sn s2 sn 再插入sn 1s sn 1 則有對於乙個字串有n 1個插入位置。因此,解題思路就是每次遞迴加入乙個字元,直到字串全...

劍指Offer 題38(字串的排列)

輸入乙個字串,列印出該字串中字元的所有排列。輸入 abc 輸出 abc acb bac bca cab cba。step1 求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有字元進行交換。step2 每次都把乙個數固定在前面,讓後面的數遞迴地進行全排列,這樣每個數都固定過以後就能找出所有排列...

劍指 Offer 38 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba class solution boolean visited new boolean s.length dfs s,vis...