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 相关文章推荐
wxPython使用系统剪切板的方法
Jun 16 Python
python插入排序算法实例分析
Jul 03 Python
Python中使用bidict模块双向字典结构的奇技淫巧
Jul 12 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
Django基础知识与基本应用入门教程
Jul 20 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
使用python绘制二维图形示例
Nov 22 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 Python
python飞机大战游戏实例讲解
Dec 04 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 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 $_SERVER当前完整url的写法
2009/11/12 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
Python从函数参数类型引出元组实例分析
2019/05/28 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
能源工程专业应届生求职信
2014/03/01 职场文书
旅游文化节策划方案
2014/06/06 职场文书
房地产端午节活动方案
2014/08/24 职场文书
企业2014年度工作总结
2014/12/10 职场文书
明确岗位职责
2015/02/14 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers