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 list转dict示例分享
Jan 28 Python
Python random模块常用方法
Nov 03 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
实例介绍Python中整型
Feb 11 Python
python字典嵌套字典的情况下找到某个key的value详解
Jul 10 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
python查看数据类型的方法
Oct 12 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
Jan 03 Python
使用python创建生成动态链接库dll的方法
May 09 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
基于Python实现对比Exce的工具
Apr 07 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 CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
2012/01/16 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
python使用tornado实现简单爬虫
2018/07/28 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
取保候审保证书
2014/04/30 职场文书
爱心捐助倡议书
2014/05/19 职场文书
责任胜于能力演讲稿
2014/05/20 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
AI:如何训练机器学习的模型
2021/04/16 Python
Redis中一个String类型引发的惨案
2021/07/25 Redis
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android