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自动格式化json文件的方法
Mar 11 Python
用Python进行TCP网络编程的教程
Apr 29 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
Jun 14 Python
Django Highcharts制作图表
Aug 27 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
python实现二维插值的三维显示
Dec 17 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
python各层级目录下import方法代码实例
Jan 20 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 Python
python 实现性别识别
Nov 21 Python
python statsmodel的使用
Dec 21 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运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php中的静态变量的基本用法
2014/03/20 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
Java及python正则表达式详解
2017/12/27 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
Python 发送邮件方法总结
2020/08/10 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
android面试问题与答案
2016/12/27 面试题
办加油卡单位介绍信
2014/01/09 职场文书
企业消防安全制度
2014/02/02 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
晚会闭幕词
2015/01/28 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
Python基础之Socket通信原理
2021/04/22 Python