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中的五种异常处理机制介绍
Sep 02 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
flask中过滤器的使用详解
Aug 01 Python
用Python将mysql数据导出成json的方法
Aug 21 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
python如何实现从视频中提取每秒图片
Oct 22 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
python add_argument()用法解析
Jan 29 Python
Python多进程编程常用方法解析
Mar 26 Python
Python调用.net动态库实现过程解析
Jun 05 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计算两个日期相差天数的方法
2015/03/14 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
javascript 定义初始化数组函数
2009/09/07 Javascript
XmlUtils JS操作XML工具类
2009/10/01 Javascript
基于jquery封装的一个js分页
2011/11/15 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python实现逆波兰计算表达式实例详解
2015/05/06 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
《巨人的花园》教学反思
2014/02/12 职场文书
运动会的口号
2014/06/09 职场文书
社区志愿者活动总结
2014/06/26 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
统计员岗位职责范本
2015/04/14 职场文书
投资合作意向书范本
2015/05/08 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
中学教代会开幕词
2016/03/04 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers
SQL中的连接查询详解
2022/06/21 SQL Server