2 13 劍指offer 字串的排列

2021-09-10 18:29:08 字數 1913 閱讀 7987

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

遞迴,分為第乙個字元和剩下的字元,求剩下的字元的排列,然後對所有排列,交換第乙個字元。

python**的特性,在對字串做切片操作時,當索引位置超出長度,python不會報錯,而只是跳過本次切取。

網上的思路

將輸入字串看成兩部分,就是第乙個元素和剩餘元素。看出解決這個問題分兩步:

1.第一步就是在第乙個位置取遍所有的元素

2.第二步就是按照第一步處理方式遞迴求解剩下的元素。

怎樣才能在第乙個位置取遍所有元素?我們可以將第乙個元素每一次都和後面的元素交換位置,那麼第乙個位置就取遍了所有的元素(對應中的(1)->(2)),既然第乙個位置所有解都已經解決,我們就求解剩下的位置,即遞迴求解和第乙個元素交換後的剩下的元素,處理方式當然和處理第乙個元素一樣。遞迴終止條件為只有乙個元素時返回本身。

思路較亂

def

permutation

(self, ss)

:# 分為第乙個字元和剩下的字元,求剩下的字元的排列,然後對所有排列,交換第乙個字元

iflen

(ss)==0

orlen

(ss)==1

:return ss

ans =

[ss]

first = ss[0]

left = ss[1:

]for k in self.permutation(left)

:for i in

range

(len

(k))

:if k[i]

!= first:

temp = k[i]

+ k[

:i]+ first + k[i+1:

]if temp not

in ans:

# 交換不包括加在第一位

temp = first + k

if temp not

in ans:

# sort函式返回值為空,對列表本身排序

ans.sort(

)return ans

遞迴+迴圈

已經遍歷過了的元素去掉了,只留下了未遍歷的剩餘的字串當做ss。因此,所有的元素遍歷完成了,ss也就是空了,就可以結束了。

def

permutation

(ss):if

len(ss)

<=0:

return

res =

perm(ss, res,'')

#初始化path = '',path為已有路徑

uniq =

list

(set

(res)

)#set()函式建立乙個無需不重複的元素集,不需要判斷元素是否重複

return

sorted

(uniq)

#sorted()函式對任意物件進行排序

defperm

(ss, res, path)

:if ss =='':

else

:for i in

range

(len

(ss)):

perm(ss[

:i]+ss[i+1:

], res, path+ss[i]

)ss1 =

'abc'

print

(permutation(ss1)

)

劍指offer 字串

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

劍指offer 字串

問題描述 function replacespace str 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含 0 次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a...

劍指offer 字串

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解這題需要把題意仔細研究清...