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 08 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python类属性的延迟计算
Oct 22 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
python django 实现验证码的功能实例代码
May 18 Python
详解Python文本操作相关模块
Jun 22 Python
浅析python打包工具distutils、setuptools
Apr 20 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python中时间转换datetime和pd.to_datetime详析
Aug 11 Python
python3跳出一个循环的实例操作
Aug 18 Python
python 如何对logging日志封装
Dec 02 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
详解Python字典的操作
2019/03/04 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
flask实现验证码并验证功能
2019/12/05 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
关于毕业的广播稿
2014/01/10 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
vue修饰符.capture和.self的区别
2022/04/22 Vue.js