JZ27 劍指offer 字串的排列

2021-10-13 12:48:23 字數 1350 閱讀 5813

題目描述

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

class

solution

:def

permutation

(self, s:

str)

-> list[

str]

: c, res =

list

(s),

defdfs

(x):

if x ==

len(c)-1

:''.join(c)

)# 新增排列方案

return

dic =

set(

)for i in

range

(x,len

(c))

:if c[i]

in dic:

continue

# 重複,因此剪枝

dic.add(c[i]

) c[i]

, c[x]

= c[x]

, c[i]

# 交換,將 c[i] 固定在第 x 位

dfs(x +1)

# 開啟固定第 x + 1 位字元

c[i]

, c[x]

= c[x]

, c[i]

# 恢復交換

dfs(0)

return res

python版本,每個內層加個只屬於當前層的字典,遍歷到重複字母進行continue操作,進行剪枝

class

solution

for(

int i = pos;ilength()

;++i)

} vector

permutation

(string str);}

perm(0

,str)

;return vector()

;}};

思路:

對於遞迴函式perm,傳入當前位置pos和字串s,從pos開始遍歷,每次將pos位和當前遍歷i位的字元交換(相當於固定當前遍歷位置,因為交換後我們只考慮pos+1後的進行遞迴),然後從pos+1開始遞迴,直到當前位置為字串末位停止(實際上在遍歷到字串倒數第二位時,迴圈進行兩次,一次不動,一次與末位交換,每次交換後進入遞迴後就會插入set並返回,所以在末位不進行迴圈),放入雜湊表中防止重複。每次遞迴回來時要在進行一次swap操作交換回當前遍歷之前狀態。

JZ27 字串的排列

知識點 遞迴 全排列 題目鏈結 題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則按字典序列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。示例1 輸入 ab...

JZ27 字串的排列

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則按字典序列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。示例1輸入 輸出 ab ab ba 字典...

劍指offer 字串

問題描述 class solution auto res temp.c str strcpy str,res strcpy 關於c 中string和char 的區別參考 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0...