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中使用pyhook实现键盘监控的例子
Jul 18 Python
Python中的高级数据结构详解
Mar 27 Python
用Python脚本来删除指定容量以上的文件的教程
May 04 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
python将字典内容存入mysql实例代码
Jan 18 Python
python3实现小球转动抽奖小游戏
Apr 15 Python
Python全栈之列表数据类型详解
Oct 01 Python
用python解压分析jar包实例
Jan 16 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
零基础小白多久能学会python
Jun 22 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 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
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Python手机号码归属地查询代码
2016/05/04 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
详解python程序中的多任务
2020/09/16 Python
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
舞蹈教师自荐信
2014/01/27 职场文书
任命书模板
2014/06/04 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
离婚财产处理协议书
2014/09/30 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android