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实现simhash算法实例
Apr 25 Python
Python中lambda的用法及其与def的区别解析
Jul 28 Python
Python捕捉和模拟鼠标事件的方法
Jun 03 Python
Python模拟百度登录实例详解
Jan 20 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
django静态文件加载的方法
May 20 Python
python 文件转成16进制数组的实例
Jul 09 Python
python 构造三维全零数组的方法
Nov 12 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
python基于tkinter制作下班倒计时工具
Apr 28 Python
pytorch MSELoss计算平均的实现方法
May 12 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 用sock技术发送邮件的函数
2007/07/21 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
实例讲解php实现多线程
2019/01/27 PHP
PDO::setAttribute讲解
2019/01/29 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
js单词形式的运算符
2014/05/06 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
Python中无限元素列表的实现方法
2014/08/18 Python
Python使用Supervisor来管理进程的方法
2015/05/28 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
python数据分析:关键字提取方式
2020/02/24 Python
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
温馨提示标语
2014/06/26 职场文书
个人向公司借款协议书
2014/10/09 职场文书
房产电话营销开场白
2015/05/29 职场文书
Java 多态分析
2022/04/26 Java/Android