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实现文件分组复制到不同目录的例子
Jun 04 Python
详解详解Python中writelines()方法的使用
May 25 Python
Python编程中time模块的一些关键用法解析
Jan 19 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
Python实现视频下载功能
Mar 14 Python
Python基础教程之利用期物处理并发
Mar 29 Python
python安装twisted的问题解析
Aug 21 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
python Socket网络编程实现C/S模式和P2P
Jun 22 Python
pandas按条件筛选数据的实现
Feb 20 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 park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
php报错502badgateway解决方法
2019/10/11 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
pyenv命令管理多个Python版本
2017/03/26 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
python数据类型强制转换实例详解
2020/06/22 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
小区物业门卫岗位职责
2014/04/10 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
mysql查找连续出现n次以上的数字
2022/05/11 MySQL