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描述器descriptor详解
Feb 03 Python
python根据给定文件返回文件名和扩展名的方法
Mar 27 Python
Python编写生成验证码的脚本的教程
May 04 Python
Python中的单继承与多继承实例分析
May 10 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
在python中实现对list求和及求积
Nov 14 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
pandas中DataFrame检测重复值的实现
May 26 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
Phpbean路由转发的php代码
2008/01/10 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
学习Vue组件实例
2018/04/28 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
js里面的变量范围分享
2020/07/18 Javascript
Python实现多线程HTTP下载器示例
2017/02/11 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
Python实现注册、登录小程序功能
2018/09/21 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
使用Python操作ArangoDB的方法步骤
2020/02/02 Python
python如何实现图片压缩
2020/09/11 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
美国在线工具商店:Acme Tools
2018/06/26 全球购物
如何唤起类中的一个方法
2013/11/29 面试题
采购助理岗位职责
2014/02/16 职场文书
社团活动总结模板
2014/06/30 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
Linux安装apache服务器的配置过程
2021/11/27 Servers
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android