首页 > 编程 > Python > 正文

python求一个字符串的所有排列的实现方法

2020-02-15 21:24:52
字体:
来源:转载
供稿:网友

题目描述:

设计一个程序,当输入一个字符串时,要求输出这个字符串的所有排列。
例如输入字符串 abc,要求输出由字母 a、b、c 所能排列出来的所有字符串 abc,acb,bac,bca,cab,cba。

方法:递归法

以字符串 abc 为例介绍对字符串进行全排列的方法。
(1) 首先固定第一个字符 a,然后对后面的两个字符 b、c 进行全排列;
(2) 交换第一个字符与其后面的字符,即交换 a 与 b,然后对后面的两个字符 a与c 进行全排列;
(3) 由于第二步交换了 a与b 破坏了字符串原来的顺序,所以需要再次交换 a与b 使其恢复到原来的顺序,然后交换第一个字符与第三个字符(交换a和c),接着固定第一个字符c,对后面的两个字符 a与b 求全排列。
在对字符串求全排列的时候就可以采用递归的方式求解。


在使用递归求解的时候,要注意:
(1) 逐渐缩小问题的规模,并且可以用同样的方法来求解子问题;
(2) 递归一定要有结束条件,否则会导致程序陷入死循环;

代码实现:

#!/usr/bin/env python3# -*- coding: utf-8 -*-# @Time  : 2020/2/3 9:49# @Author : buu# @Software: PyCharm# @Blog  :https://blog.csdn.net/weixin_44321080def swap(str, i, j):  # 交换字符数组下标为i和j对应的字符  tmp = str[i]  str[i] = str[j]  str[j] = tmpdef permutation(str, start):  """  对字符串中的字符进行全排列  :param str: 待排序的字符串,list  :param start: 待排序的子字符串的首字符下标  :return:  """  if str == None or start < 0:    return  if start == len(str) - 1:    # 完成全排列后输出当前排列的字符串    print(''.join(str),end=' ')  else:    i = start    while i < len(str):      # 交换start与i所在位置的字符      swap(str, start, i)      # 固定第一个字符,对剩余的字符进行全排列      permutation(str, start + 1)      # 还原start与i所在位置的字符      swap(str, start, i)      i += 1def permutation_transe(s):  str = list(s)  permutation(str, 0)if __name__ == '__main__':  s = 'abc'  permutation_transe(s)

结果:


算法性能分析:
假设这种方法所需的基本操作数为 f(n),f(n) = n×f(n-1) = …= n!
所以时间复杂度为O(n!);
空间复杂度为O(1);

引申:

如何去掉重复的排列?
当字符串中没有重复的字符的时候,它的所有组合对应的字符串就没有重复的情况;当时当字符串中有重复的字符的时候,例如 ‘baa',此时如果按照上面介绍的算法求全排列会有重复的字符串。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表