python编程题:字符串的(所有可能的)排列组合

前言

在此研究:
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()

总结

Permutation

noun
[usually pl.] 排列(方式);组合(方式);置换
any of the different ways in which a set of things can be ordered
The possible permutations of x, y and z are xyz, xzy, yxz, yzx, zxy and zyx.
x、y和z的可能的组合方式为xyz、xzy、yxz、yzx、zxy和zyx。

此外,一开始不太明白Python的递归,没看懂代码,参考[2],就明白一些了。

此外,还参考了相关网站 [3], [4]

参考文献

[1] 求字符串全排列 python实现. https://blog.csdn.net/sty945/article/details/79839567

[2] 递归函数. https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00137473836826348026db722d9435483fa38c137b7e685000

[3] python实现字符串全排列(注:每个字符写在了列表里). https://blog.csdn.net/hanfeixue11/article/details/52474448

[4] python3:实现字符串的全排列. https://blog.csdn.net/chl0000/article/details/8583446

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页