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


Posted in Python onFebruary 04, 2020

题目描述:

设计一个程序,当输入一个字符串时,要求输出这个字符串的所有排列。
例如输入字符串 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 求全排列。
在对字符串求全排列的时候就可以采用递归的方式求解。

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

在使用递归求解的时候,要注意:
(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_44321080
def swap(str, i, j):
  # 交换字符数组下标为i和j对应的字符
  tmp = str[i]
  str[i] = str[j]
  str[j] = tmp


def 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 += 1


def permutation_transe(s):
  str = list(s)
  permutation(str, 0)


if __name__ == '__main__':
  s = 'abc'
  permutation_transe(s)

结果:

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

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

引申:

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

思路:
全排列的主要思路为:从第一个字符起每个字符分别与它们后面的字符进行交换:例如对于“baa”,交换 baa 第一个与第二个字符后得到“aba”,再考虑交换 baa 第一个与第三个字符后得到“aab”,由于 baa 的第二个字符与第三个字符相等,所以会导致两种交换方式得到的 aba 与 aab 对应的全排列是重复的(在固定aba与aab的第一个字符的情况下,它们对应的全排列都为 aba,aab)。
所以可以知道,去掉重复排列的主要思路为:
从第一个字符起,每个字符分别与它后面的非重复出现的字符进行交换。在递归的基础上只需要增加一个判断字符是否重复出现的函数即可。

代码实现:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time  : 2020/2/3 10:37
# @Author : buu
# @Software: PyCharm
# @Blog  :https://blog.csdn.net/weixin_44321080
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time  : 2020/2/3 9:49
# @Author : buu
# @Software: PyCharm
# @Blog  :https://blog.csdn.net/weixin_44321080
def swap(str, i, j):
  # 交换字符数组下标为i和j对应的字符
  tmp = str[i]
  str[i] = str[j]
  str[j] = tmp

def isDuplicate(str,begin,end):
  """
  判断 [begin,end)区间中是否有字符与 *end相等
  :param begin: 指向字符的指针
  :param end: 指向字符的指针
  :return: 如果有相等的字符True,else False
  """
  i=begin
  while i<end:
    if str[i]==str[end]:
      return True
    else:
      i+=1
  return False


def 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):
      # 若有重复字符,则终止当前循环,开始下一次循环
      if isDuplicate(str,start,i):
        i+=1
        continue
      # 交换start与i所在位置的字符
      swap(str, start, i)
      # 固定第一个字符,对剩余的字符进行全排列
      permutation(str, start + 1)
      # 还原start与i所在位置的字符
      swap(str, start, i)
      i += 1


def permutation_transe(s):
  str = list(s)
  permutation(str, 0)


if __name__ == '__main__':
  s = 'baa'
  permutation_transe(s)

结果:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中sys.argv参数用法实例分析
May 20 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
python2.6.6如何升级到python2.7.14
Apr 08 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
django 中使用DateTime常用的时间查询方式
Dec 03 Python
浅析Python模块之间的相互引用问题
Feb 26 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 #Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 #Python
python dumps和loads区别详解
Feb 04 #Python
Python2和Python3中@abstractmethod使用方法
Feb 04 #Python
python如何求数组连续最大和的示例代码
Feb 04 #Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 #Python
TensorFlow实现自定义Op方式
Feb 04 #Python
You might like
生成php程序的php代码
2008/04/07 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
基于php缓存的详解
2013/05/15 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
php实现多城市切换特效
2015/08/09 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
Python FFT合成波形的实例
2019/12/04 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
如何理解Python中包的引入
2020/05/29 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
房产销售经理职责
2013/12/20 职场文书
银行员工辞职信范文
2014/01/20 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
团代会邀请函
2015/02/02 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
Python基本知识点总结
2022/04/07 Python