題目描述
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串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...