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单链表实现代码实例
Nov 21 Python
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
python的Crypto模块实现AES加密实例代码
Jan 22 Python
django中的HTML控件及参数传递方法
Mar 20 Python
简单实现python数独游戏
Mar 30 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
python实现根据文件格式分类
Oct 31 Python
python函数中将变量名转换成字符串实例
May 11 Python
pytorch中index_select()的用法详解
Jan 06 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中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
基于php编程规范(详解)
2017/08/17 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
浅谈js中的this问题
2017/08/31 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
python 对key为时间的dict排序方法
2018/10/17 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
电大自我鉴定范文
2013/10/01 职场文书
公司中秋节活动方案
2014/02/12 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
内衣营销方案
2014/03/15 职场文书
企业宗旨标语
2014/06/10 职场文书
党员志愿者活动方案
2014/08/28 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
撤诉书怎么写
2015/05/19 职场文书
读《庄子》有感:美而不自知
2019/11/06 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
nginx服务器的下载安装与使用详解
2021/08/02 Servers
MySQL批量更新不同表中的数据
2022/05/11 MySQL