python3:实现字符串的全排列(无重复字符)
最近在学一些基础的算法,发现我的数学功底太差劲了,特别是大学的这一部分,概率论、线性代数、高数等等,这些大学学的我是忘得一干二净(我当时学的时候也不见得真的懂),导致现在学习算法,非常的吃力。唉!不说了,补习中。。。
抛出问题
求任意一个字符串的全排列组合,例如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)
......
这个可能我讲的不是特别清楚,理解起来不是特别容易,这种方式经过我的测试,发现他更费时。
自我感觉两种方法区别不大,原理上是一样的,都是先确定前面的部分,处理后边的,从后往前走。
python3:实现字符串的全排列(无重复字符)的更多相关文章
- C语言字符串之无重复字符的最长子串
题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 输入: "abcabcbb" 输出: 解释: 因为无重复字符的最长子串是 . 输入: " ...
- LeetCode3_无重复字符的最长子串(数组&字符串问题)
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "ab ...
- 【leetcode算法-中等】3. 无重复字符的最长字串
[题目描述] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 " ...
- lintcode: 最长无重复字符的子串
题目 最长无重复字符的子串给定一个字符串,请找出其中无重复字符的最长子字符串. 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 ...
- leetcode刷题第三天<无重复字符的最长子串>
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 : 输入: "abcabcbb" 输出: 解释: 因为无重复字符的最长子串是 . 示例 : 输入: &quo ...
- [Swift]LeetCode3. 无重复字符的最长子串 | Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...
- [LeetCode] 3. 无重复字符的最长子串
题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...
- day4——无重复字符的最长子串
// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第2题 今日算法 题干 //给定一个字符串,请你找出其中不含有重复字符的 最长子串 ...
- leetcode 刷题(3)--- 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...
- Leetcode(三)无重复字符的最长子串
3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...
随机推荐
- 二十四. Python基础(24)--封装
二十四. Python基础(24)--封装 ● 知识结构 ● 类属性和__slots__属性 class Student(object): grade = 3 # 也可以写在__slots ...
- Vuejs的$nextTick原理
本质: nextTick,本质上是一个异步API,表示当前同步流程执行完成后再调用传入的函数. 根据环境不同,异步API的实现可以分别通过: setTimeout(0), new Promise(), ...
- List集合1
一.List接口介绍 List继承自Collection接口,是单列集合的一个重要分支,习惯性的会将实现List接口的对象称为List集合 二.List接口3个特点 1.有序(有序不是顺序,有序指的是 ...
- 说说VBA中的面向对象
对象是 Visual Basic 的结构基础,在 Visual Basic 中进行的所有操作几乎都与修改对象有关.Microsoft Word 的任何元素,如文档.表格.段落.书签.域等,都可用 Vi ...
- thinkPHP 分页样式增加下拉列表
$linkPage=" <select name='sldd' style='width:40px;height:30px;border:1px red block;' onchan ...
- java知识点归集
将工作中,或者看书的过程中碰到的自己之前没有掌握的知识点进行归纳,暂时就碰到什么写什么,后续有一定量的话进行整理: 1. list实现 相关文章:https://zhuanlan.zhihu.com ...
- django之Session、Cookie
Session ·Session存在于服务器端 ·Session的设置: request.session['name'] = value ·Session的获取: dic = request.sess ...
- 内存泄露java.lang.OutOfMemoryError: PermGen space解决方法
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被 ...
- PHP涉及的所有英文单词
PHP涉及的所有英文单词拦路虎 PHP再火,也会让一部同学心生畏惧,因为看到编辑器中那一串串英文单词,担心自己英文不好,从而对能学会PHP的决心产生动摇.其实大可不必,英文在学习PHP过程中真的连级别 ...
- 印象笔记无法连服务器(internet explore的问题)
https://www.zhihu.com/question/20214497?sort=created