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之wxPython菜单使用详解
Sep 28 Python
Python爬取国外天气预报网站的方法
Jul 10 Python
python利用正则表达式提取字符串
Dec 08 Python
微信跳一跳小游戏python脚本
Jan 05 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
Django自定义用户登录认证示例代码
Jun 30 Python
python实现简易学生信息管理系统
Apr 05 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
Python实现验证码识别
Jun 15 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 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抓即时股票信息
2006/10/09 PHP
PHP入门
2006/10/09 PHP
xajax写的留言本
2006/11/25 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
2019/08/08 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
Python os.access()用法实例
2019/02/18 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
Django model class Meta原理解析
2020/11/14 Python
软件测试笔试题
2012/10/25 面试题
会计实习生工作总结的自我评价
2013/10/07 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
西湖英语导游词
2015/02/06 职场文书
感谢信
2019/04/11 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL