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获取指定网页上所有超链接的方法
Apr 04 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
python实现NB-IoT模块远程控制
Jun 20 Python
django数据库自动重连的方法实例
Jul 21 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
Feb 23 Python
Python模块相关知识点小结
Mar 09 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
Python是什么 Python的用处
May 26 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
Python爬取网页信息的示例
Sep 24 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
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
Python功能键的读取方法
2015/05/28 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
python logging通过json文件配置的步骤
2020/04/27 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
Python ellipsis 的用法详解
2020/11/20 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
餐饮业会计岗位职责
2013/12/19 职场文书
法学院方阵解说词
2014/01/29 职场文书
广告设计应届生求职信
2014/03/01 职场文书
党员公开承诺书内容
2014/05/20 职场文书
施工安全生产承诺书
2014/05/23 职场文书
增员口号大全
2014/06/18 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书