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字符串拼接的几种方法整理
Aug 02 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
浅谈python3.6的tkinter运行问题
Feb 22 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
详解Python直接赋值,深拷贝和浅拷贝
Jul 09 Python
Python使用pyenv实现多环境管理
Feb 05 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
python Tkinter的简单入门教程
Apr 11 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模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
PHP反向代理类代码
2014/08/15 PHP
php动态绑定变量的用法
2015/06/16 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
js Function类型
2011/12/04 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
python3生成随机数实例
2014/10/20 Python
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python使用gRPC传输协议教程
2018/10/16 Python
Python中字符串与编码示例代码
2019/05/20 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
常见的软件开发流程有哪些
2015/11/14 面试题
创新型城市实施方案
2014/03/06 职场文书
年检委托书
2014/08/30 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
优秀大学生自荐信
2015/03/26 职场文书
亮剑观后感
2015/06/05 职场文书
合作协议书格式范本
2016/03/21 职场文书
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技