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(Tornado)模拟登录小米抢手机
Nov 12 Python
python中的函数用法入门教程
Sep 02 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
Python 创建子进程模块subprocess详解
Apr 08 Python
Python实现TCP/IP协议下的端口转发及重定向示例
Jun 14 Python
Python 正则表达式实现计算器功能
Apr 29 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
flask-restful使用总结
Dec 04 Python
Python使用python-docx读写word文档
Aug 26 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 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
合作指挥官:孟斯克
2020/03/16 星际争霸
php中数据的批量导入(csv文件)
2006/10/09 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
PHP实现微信提现功能
2018/09/30 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
详解支持Angular 2的表格控件
2017/01/19 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
生物技术研究生自荐信
2013/11/12 职场文书
王老吉广告词
2014/03/20 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS