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 django 访问静态文件出现404或500错误
Jan 20 Python
Python 专题一 函数的基础知识
Mar 16 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
分享7个 Python 实战项目练习
Mar 03 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
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
php命令行写shell实例详解
2018/07/19 PHP
phpStorm2020 注册码
2020/09/17 PHP
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
python文件特定行插入和替换实例详解
2017/07/12 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python Series从0开始索引的方法
2018/11/06 Python
python如何获取apk的packagename和activity
2020/01/10 Python
美国在线宠物商店:Chewy
2019/01/12 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
应届大学生自荐信格式
2013/09/21 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
小学开学典礼主持词
2014/03/19 职场文书
环保倡议书400字
2014/05/15 职场文书
商业街策划方案
2014/05/31 职场文书
健康状况证明模板
2014/10/23 职场文书
家属答谢词
2015/01/05 职场文书
听证会主持词
2015/07/03 职场文书
小学生教师节广播稿
2015/08/19 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
八年级作文之感恩
2019/11/22 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
Python数据可视化之Seaborn的安装及使用
2022/04/19 Python
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS