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  __getattr__与__setattr__使用方法
Sep 06 Python
Python库urllib与urllib2主要区别分析
Jul 13 Python
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
Python实现采用进度条实时显示处理进度的方法
Dec 19 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
Python读取txt某几列绘图的方法
Oct 14 Python
Python3视频转字符动画的实例代码
Aug 29 Python
简单了解python元组tuple相关原理
Dec 02 Python
详解python polyscope库的安装和例程
Nov 13 Python
python实现求纯色彩图像的边框
Apr 08 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
用PHP生成html分页列表的代码
2007/03/18 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
smarty表格换行实例
2014/12/15 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
javascript下数值型比较难点说明
2010/06/07 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
[00:57]深扒TI7聊天轮盘语音出处5
2017/05/11 DOTA
Python实现分割文件及合并文件的方法
2015/07/10 Python
python实现简易云音乐播放器
2018/01/04 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
adidas泰国官网:adidas TH
2020/07/11 全球购物
计算机工程学院个人求职信
2013/10/05 职场文书
幼教简历自我评价
2014/01/28 职场文书
《果园机器人》教学反思
2014/04/13 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
创业计划书之校园超市
2019/09/12 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Golang 正则匹配效率详解
2021/04/25 Golang