Python字符串的全排列算法实例详解


Posted in Python onJanuary 07, 2019

本文实例讲述了Python字符串的全排列算法。分享给大家供大家参考,具体如下:

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入描述

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

注意有可能重复,因此需要判断
注意list的append方法和list的+方法的区别
append方法在list后面添加元素
+方法在list后面添加list
如果使用append(list),那么list中所有的元素都会作为一项插入

swap函数将新的元素与之前的所有元素交换,返回一个列表,每一次交换都插入一个元素,因此是append方法

def swap(self, newElem, Elem):
 result = []
 listElem = list(Elem)
 listElem.insert(0, newElem)
 result.append(''.join(listElem))
 for i in range(1, len(listElem)):
 preList = listElem[:] #注意这个地方
 listElem[0], listElem[i] = listElem[i], listElem[0]
 if listElem != preList: #处理重复情况
 result.append(''.join(listElem))
 listElem[0], listElem[i] = listElem[i], listElem[0]
 return result

如果使用+方法:

def swap(newElem, Elem):
 result = []
 listElem = list(Elem)
 listElem.insert(0, newElem)
 #result.append(''.join(listElem))
 result += ''.join(listElem)
 for i in range(1, len(listElem)):
 preList = listElem[:] # 注意这个地方
 listElem[0], listElem[i] = listElem[i], listElem[0]
 if listElem != preList: # 处理重复情况
  #result.append(''.join(listElem))
  result += ''.join(listElem)
 listElem[0], listElem[i] = listElem[i], listElem[0]
 return result
print(swap('1', '234'))
>>>>['1', '2', '3', '4', '2', '1', '3', '4', '3', '2', '1', '4', '4', '2', '3', '1']

递归调用函数

这个地方要用+号,因为是加上每次调用的结果list(有多个元素),而不能append

def recurtionPermutation(self, ss, index):
 result = []
 if index == 0:
 result.append(ss[0])
 else:
 previousList = self.recurtionPermutation(ss, index - 1)
 newElem = ss[index]
 #print(previousList)
 for Elem in previousList:
 result += self.swap(newElem, Elem) #这里返回的是一个数组,数组加数组使用+,数组加元素使用append符号
 return result

按照字典排序

这里我按照冒泡字典排序,实际上没有必要,比较字符大小直接可以用sorted函数。

sorted函数又方便又高效

def BubbleSortByDic(self, result):
 for i in range(len(result)):
 for j in range(len(result) - 1, i, -1):
 if result[j] < result[i]:
  result[i], result[j] = result[j], result[i]
 return result

AC代码:

class Solution:

def swap(self, newElem, Elem):
 result = []
 listElem = list(Elem)
 listElem.insert(0, newElem)
 result.append(''.join(listElem))
 for i in range(1, len(listElem)):
  preList = listElem[:] #注意这个地方
  listElem[0], listElem[i] = listElem[i], listElem[0]
  if listElem != preList: #处理重复情况
  result.append(''.join(listElem))
  listElem[0], listElem[i] = listElem[i], listElem[0]
 return result
 def recurtionPermutation(self, ss, index):
 result = []
 if index == 0:
  result.append(ss[0])
 else:
  previousList = self.recurtionPermutation(ss, index - 1)
  newElem = ss[index]
  #print(previousList)
  for Elem in previousList:
  result += self.swap(newElem, Elem) #这里返回的是一个数组,数组加数组使用+,数组加元素使用append符号
 return result
 # def BubbleSortByDic(self, result):
 # for i in range(len(result)):
 #  for j in range(len(result) - 1, i, -1):
 #  if result[j] < result[i]:
 #   result[i], result[j] = result[j], result[i]
 # return result
 def Permutation(self, ss):
 # write code here
 if ss == '':
  return []
 #return self.BubbleSortByDic(self.recurtionPermutation(ss, len(ss) - 1))
 return sorted(self.recurtionPermutation(ss, len(ss) - 1))
print(Solution().Permutation('acdfb'))

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python将人民币转换大写的脚本代码
Feb 10 Python
python在不同层级目录import模块的方法
Jan 31 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
详解Python中的type和object
Aug 15 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
详解Python下Flask-ApScheduler快速指南
Nov 04 Python
Python面向对象之类的封装操作示例
Jun 08 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 #Python
Python进阶之自定义对象实现切片功能
Jan 07 #Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 #Python
python读取几个G的csv文件方法
Jan 07 #Python
实时获取Python的print输出流方法
Jan 07 #Python
Python 运行 shell 获取输出结果的实例
Jan 07 #Python
在python 中实现运行多条shell命令
Jan 07 #Python
You might like
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
javascript new一个对象的实质
2010/01/07 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
图文讲解vue的v-if使用方法
2019/02/11 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
查看Django和flask版本的方法
2018/05/14 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Django logging配置及使用详解
2019/07/23 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
经贸韩语专业大学生职业规划
2014/02/14 职场文书
优秀公益广告词大全
2014/03/19 职场文书
辞职信如何写
2015/02/27 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers