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中os和shutil模块实用方法集锦
May 13 Python
用python实现面向对像的ASP程序实例
Nov 10 Python
python计算牛顿迭代多项式实例分析
May 07 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
在Django的View中使用asyncio的方法
Jul 12 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
pandas分批读取大数据集教程
Jun 06 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为SHOPEX增加日志功能代码
2010/07/02 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
js实现进度条的方法
2015/02/13 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
2016/01/26 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
Node.js实现文件上传的示例
2017/06/28 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
python sys.argv[]用法实例详解
2018/05/25 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
区分python中的进程与线程
2020/08/13 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
运动会闭幕式解说词
2014/02/21 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
小学家庭教育心得体会
2016/01/14 职场文书