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脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
python 利用栈和队列模拟递归的过程
May 29 Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
Python3.5集合及其常见运算实例详解
May 01 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
24式加速你的Python(小结)
Jun 13 Python
python scrapy爬虫代码及填坑
Aug 12 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 Python
Python基础详解之描述符
Apr 28 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 auth_http类库进行身份效验
2009/03/19 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
如何离线执行php任务
2017/02/21 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
Python实现获取操作系统版本信息方法
2015/04/08 Python
Python素数检测实例分析
2015/06/15 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
python中property和setter装饰器用法
2019/12/19 Python
python统计字符的个数代码实例
2020/02/07 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
详解Python 循环嵌套
2020/07/09 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
JAVA高级程序员面试题
2013/09/06 面试题
建筑工程自我鉴定
2013/10/18 职场文书
企业申诉管理制度
2014/01/30 职场文书
内衣营销方案
2014/03/15 职场文书
个人批评与自我批评
2014/10/15 职场文书
大学生暑期实践报告
2015/07/13 职场文书