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 26 Python
python 的列表遍历删除实现代码
Apr 12 Python
Python中属性和描述符的正确使用
Aug 23 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
python三大神器之fabric使用教程
Jun 10 Python
python字符串查找函数的用法详解
Jul 08 Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
Python标准库shutil模块使用方法解析
Mar 10 Python
基于python实现模拟数据结构模型
Jun 12 Python
python 实现汉诺塔游戏
Nov 28 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
ThinkPHP的L方法使用简介
2014/06/18 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
详解python算法之冒泡排序
2019/03/05 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
Python如何操作docker redis过程解析
2020/08/10 Python
python 实现控制鼠标键盘
2020/11/27 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
工程管理造价应届生求职信
2013/11/13 职场文书
退休感言
2014/01/28 职场文书
表彰会主持词
2014/03/26 职场文书
学校欢迎标语
2014/06/18 职场文书
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python