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的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
python PIL模块的基本使用
Sep 29 Python
Python中的xlrd模块使用整理
Jun 15 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二进制与字符串之间的相互转换教程
2016/10/14 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
jquery蒙版控件实现代码
2010/12/08 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
小学生作文评语
2014/04/18 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
一文搞懂Python Sklearn库使用
2021/08/23 Python
python读取mat文件生成h5文件的实现
2022/07/15 Python
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技