首页 > 编程语言 >python3实现字符串的全排列的方法(无重复字符)两种解决方法

python3实现字符串的全排列的方法(无重复字符)两种解决方法

时间:2023-01-04 19:57:17浏览次数:46  
标签:字符 遍历 val list len str 字符串 方法 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
#Python学习交流QQ群:489111204
#递归求结果
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)

......

这个可能我讲的不是特别清楚,理解起来不是特别容易,这种方式经过我的测试,发现他更费时。

自我感觉两种方法区别不大,原理上是一样的,都是先确定前面的部分,处理后边的,从后往前走。

标签:字符,遍历,val,list,len,str,字符串,方法,python3
From: https://www.cnblogs.com/python1111/p/17025840.html

相关文章

  • vue的set()方法
    $set对vue双向绑定的。有时候数据是单项的当第二个部分为真的时候,然后将第三部分替换或添加进去。第一个是添加,添加到数组末尾。之后的是替换。什么看得懂就从哪里开始......
  • JS获取字符串长度的常用方法,汉字算两个字节
    JS获取字符串实际长度(双字节字符、汉字算两个字符)//第一种GetLength=function(str){varrealLength=0;for(vari=0;i<str.length;i++){......
  • java基础toString()方法
    1.Object()类下的toSting()方法Java默认的toString方法来自Object类 在Java中每个类都直接或者间接继承Object类,toString()方法同样是来自于Object类在没有重写toString......
  • Python内置方法
    开胃菜(小例子、用法):help(method)查看帮助,按space或enter继续显示多的行数(--More--),按ctrl+c退出。如果想要查看有哪些方法,比如list有哪些方法,可以:dir(list)输出:>......
  • icp备案怎么查询?查询ICP的方法?
    网站ICP备案的目的就是国家为了防止一些人在网上从事一些非法经营活动,打击不良信息的传播,如果网站不备案的话,将网站信息放在国内主机中,我们是无法正常打开网站的。做新网站......
  • 电子工程数学方法-Matlab Doolittle Householder Givens
    1.基于Givens变换QR分解Matlab代码原作者:【原创】基于Givens变换QR分解Matlab代码|MATLAB数学统计与优化|MATLAB技术论坛-PoweredbyDiscuz!(matlabsky.com)functi......
  • 万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!
    众所周知,Python3.11版本带来了较大的性能提升,但是,它具体在哪些方面上得到了优化呢?除了著名的“香农计划”外,它还包含哪些与性能相关的优化呢?本文将带你一探究竟!作者:Beshr......
  • 公历闰年和农历闰月的计算方法
    世界上的历法共有三类阳历,就是以地球绕太阳运转一圈的时间为一年,年的月数和月的日数可人为规定;又称为公历。阴历,就是以月球绕地球运转一圈的时间为一个月,只有年的月......
  • Java 中文字符串编码之GBK转UTF-8
    写过两篇关于编码的文章了,以为自己比较了解编码了呢?!结果今天又结结实实的上了一课。以前转来转去解决的问题终归还是简单的情形。即iso-8859-1转utf-8,或者iso-8859-1转gb......
  • VB6.0中Print 方法使用
    print方法在VB6.0中我们经常会用到print方法,它可以在窗体、图形框中输出信息。作用:在窗体、图形框输出信息,缺省对象为窗体。语法格式[对象.]print[定位函数][输......