python3实现字符串的全排列的方法(无重复字符)


Posted in Python onJuly 07, 2018

最近在学一些基础的算法,发现我的数学功底太差劲了,特别是大学的这一部分,概率论、线性代数、高数等等,这些大学学的我是忘得一干二净(我当时学的时候也不见得真的懂),导致现在学习算法,非常的吃力。唉!不说了,补习中。。。

抛出问题

求任意一个字符串的全排列组合,例如a='123',输出 123,132,213,231,312,321。(暂时假定字符串没有重复)

解决方案

目前有两种解决的方法

方法一:

def str_sort(s=''):
  if len(s) <= 1:
    return [s]
  str_list = []
  for i in range(len(s)):
    for j in str_sort(s[0:i] + s[i + 1:]):
      str_list.append(s[i] + j)
  return str_list


str_list = str_sort('abc')
print(len(str_list), str_list)

这种理解起来非常好理解,就是循环遍历每个字符,让每个字符打头,然后继续递归遍历后边的字符

方法二:

#字符串任意两个位置字符交换
def str_replace(str, x, y):
  if x == y:
    return str
  x_val = str[x:x+1]
  y_val = str[y:y+1]
  if x < y:
    str = str[0:x] + y_val + str[x+1:y] + x_val + str[y+1:len(str)]
  else:
    str = str[0:y] + x_val + str[y+1:x] + y_val + str[x+1:len(str)]
  return str
#递归求结果
def str_sort(str,x):
  if x == len(str):        #当x为字符串的最大长度时返回当前字符交换的结果
    global str_list
    str_list.append(str)
    return
  for i in range(x,len(str)):
    str = str_replace(str,i,x) #递归遍历第i个字符,
    str_sort(str,x+1)
    str = str_replace(str,x,i) #恢复字符串原来的顺序,便于下次遍历
s = 'abc'
global str_list
str_list = []
str_sort(s,0)
print(len(str_list), str_list)

这种方法在求解的思路上就已经有了很大的提升,不是像上一个靠“蛮力”去解决问题,这是递归的一种方式,大概原理就是,先保持前I个字符不变,遍历交换后边的字符,这样一直递归到,最后两个字符,然后再返回去改变倒数第三个字符,再次遍历后边的两位,直到三个字符的全部输出,也就是这样的顺序,

第一次输出

X(n),X(n-1),X(n-2),......X(3),X(2),X(1)

第二次输出

X(n),X(n-1),X(n-2),......X(3),X(1),X(2)

第三次输出

X(n),X(n-1),X(n-2),......X(2),X(3),X(1)

第四次输出

X(n),X(n-1),X(n-2),......X(2),X(1),X(3)

......

这个可能我讲的不是特别清楚,理解起来不是特别容易,这种方式经过我的测试,发现他更费时。

自我感觉两种方法区别不大,原理上是一样的,都是先确定前面的部分,处理后边的,从后往前走。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python标准库os.path包、glob包使用实例
Nov 25 Python
python查看FTP是否能连接成功的方法
Jul 30 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
Python Json数据文件操作原理解析
May 09 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
详解Python中import机制
Sep 11 Python
python模拟点击玩游戏的实例讲解
Nov 26 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
python实现简易自习室座位预约系统
Jun 30 Python
python3 kmp 字符串匹配的方法
Jul 07 #Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 #Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 #Python
python求最大连续子数组的和
Jul 07 #Python
python 平衡二叉树实现代码示例
Jul 07 #Python
详解python异步编程之asyncio(百万并发)
Jul 07 #Python
基于Python开发chrome插件的方法分析
Jul 07 #Python
You might like
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
php常用文件操作函数汇总
2014/11/22 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
Python-基础-入门 简介
2014/08/09 Python
Python读取Excel的方法实例分析
2015/07/11 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
PHP面试题大全
2015/10/16 面试题
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
文明村镇申报材料
2014/05/06 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
交通志愿者活动总结
2014/06/27 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
电气工程师岗位职责
2015/02/12 职场文书
教师求职自荐信
2015/03/26 职场文书
升学宴来宾致辞
2015/07/27 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
Django中session进行权限管理的使用
2021/07/09 Python
Redis数据同步之redis shake的实现方法
2022/04/21 Redis