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语言编写电脑时间自动同步小工具
Mar 08 Python
python类装饰器用法实例
Jun 04 Python
Python 数据结构之堆栈实例代码
Jan 22 Python
python中的字典操作及字典函数
Jan 03 Python
Django实现组合搜索的方法示例
Jan 23 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
python pillow模块使用方法详解
Aug 30 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
使用python创建生成动态链接库dll的方法
May 09 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
python中remove函数的踩坑记录
Jan 04 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 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中的串行化变量和序列化对象
2006/09/05 PHP
php桌面中心(三) 修改数据库
2007/03/11 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
Python中字符串与编码示例代码
2019/05/20 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
周年庆典邀请函范文
2014/01/23 职场文书
作文批改评语大全
2014/04/23 职场文书
学习党代会心得体会
2014/09/05 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
求职自我评价范文100字
2014/09/23 职场文书
借款民事起诉状范文
2015/05/19 职场文书
参加招聘会后的感想
2015/08/10 职场文书
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
Python图像处理库PIL详细使用说明
2022/04/06 Python
vue里使用create, mounted调用方法
2022/04/26 Vue.js