前言
在此研究:
1)給定一個字符串,如何對其中字母進行排列組合;
2)進一步了解Python遞歸。
題目內容
在指定位置編寫代碼,完成函數,根據給定的字符串,給出組成該字符串的字符的所有排列構成的字符串,例如字符串為abc時,結果為abc、acb、bac、bca、cab、cba。(提示:可以考慮拿掉某個位置的字符,則“該字符+其左邊字符的所有排列+其右邊字符的所有排列”就是該字符在指定位置的所有排列字符串)
解題思路
可以用遞歸的方法來解決問題。
1)我們先確定字符串第一個字母是誰,對於長度為n的字符串,總共有n種情況;
2)然后呢,問題就從“返回字符串中的字母排列組合” 變成了 “返回 第一個字母+除去第一個字母外的字符串的排列組合”,有點大而化小,分而治之的感覺。
具體代碼,網上很多地方都有代碼答案,只需在百度搜索關鍵字”Python 字符串排列組合“即可,所以這里我就不另寫代碼了,引用 [1],因為我感覺這個算是解釋的比較詳細的了。
代碼如下 [1]:
def perm(s=''): # 這里是遞歸函數的出口,為什么呢,因為這里表示:一個長度為1的字符串,它的排列組合就是它自己。 if len(s)<=1: return [s] sl=[] #保存字符串的所有可能排列組合 for i in range(len(s)): #這個循環,對應 解題思路1)確定字符串的第一個字母是誰,有n種可能(n為字符串s的長度 for j in perm(s[0:i]+s[i+1:]): #這個循環,對應 解題思路2)進入遞歸,s[0:i]+s[i+1:]的意思就是把s中的s[i]給去掉 sl.append(s[i]+j) # 對應 解題思路2)問題就從“返回字符串中的字母排列組合” **變成了** “返回 第一個字母+除去第一個字母外的字符串的排列組合” return sl def main(): perm_nums=perm('abb') # 有可能存在字母相同的情況 no_repeat_nums = list(set(perm_nums)) # 去重,挺牛的,這個代碼 print('perm_nums', len(perm_nums), perm_nums) print('no_repeat_nums', len(no_repeat_nums), no_repeat_nums) pass if __name__ == '__main__': main()
版權聲明:如需轉載或引用,請注明出處。 https://blog.csdn.net/weixin_39278265/article/details/84747368