題目描述
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
分析:
看過答案,部落格,用遞迴解決,總感覺有點問題:遞迴解法每次處理乙個子串,怎麼將子串拼接成完整的字串?(寫這幾個字時,靈光一閃:每次處理的都是完整的字串,不用拆開的,用下標標註每次需要處理的子串的開始位置,到遞迴的出口處,還是原來長度的字串)
res =
defswap
(s, i, j)
:if i == j:
return s
else
:return
''.join(
(s[:i]
, s[j]
, s[i+
1:j]
, s[i]
, s[j+1:
]))def
permute
(s, start)
:#1個字元不處理
iflen
(s)<2:
return
#遞迴出口,子字串長度為2,則該字串是結果,交換這個字串之後,又是乙個結果,儲存之if(
len(s[start:])
==2):
snew = swap(s, start, start+1)
return
#字串長度大於等於3,則依次將子串的第乙個字元和自己以及後續字元交換,得到新的字串
#繼續遞迴處理
for i in
range
(start,
len(s)):
snew = swap(s, start, i)
permute(snew, start+1)
a ='abc'
permute(a,0)
print
(res)
#['abc', 'acb', 'bac', 'bca', 'cba', 'cab']
對於沒有重複字元,上面的**ok的,但是牛客上的測試案例是包含有重複數字的,為此,做如下修改: 字串的排列 全排列
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。使用itertools中的permutations,可以實現全排列 ...
遞迴 字串全排列 全排列
在高中階段我們已經通過大量的習題了解了排列和組合。但是有時候我們研究的不是由排列和組合算出來的數字,研究的是生成排列和組合。即,把集合中元素所有的排列和組合全部列出來,然後研究這些序列的性質。今天我用兩種方法講一下如何生成排列。注意我們這裡涉及的順序都是序列的字典序。序列的字典序 設有兩個序列,第乙...
字串全排列
依次選出每乙個字元元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。以對字串abc進行全排列為例,我們可以這麼做 固定a,求後面bc的排列 abc,acb,求好後,a和b交換,得到bac 固定b,求後面ac的排列 bac,bca,求好後,c放到第一位置,...