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的collections模块中的deque双端队列结构
Jul 07 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
Python3视频转字符动画的实例代码
Aug 29 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
pygame用blit()实现动画效果的示例代码
May 28 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
python利用opencv保存、播放视频
Nov 02 Python
Python基于template实现字符串替换
Nov 27 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
python实现双链表
May 25 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
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
详解参数传递四种形式
2015/07/21 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
js+html获取系统当前时间
2017/11/10 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
python实现无证书加密解密实例
2014/10/27 Python
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
python验证码图片处理(二值化)
2019/11/01 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
手机配件第一品牌:ZAGG
2017/05/28 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
经理秘书岗位职责
2013/11/14 职场文书
培训楼经理岗位责任制
2014/02/10 职场文书
物业保安员岗位职责
2014/03/14 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
增员口号大全
2014/06/18 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
Python函数中的不定长参数相关知识总结
2021/06/24 Python