輸入一個字符串,輸出該字符中字符的所有組合。


前言
在此研究:
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM