輸入乙個字串,長度不超過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 均不匹配 解這題需要把題意仔細研究清...