我的个人微信公众号:Microstrong

微信公众号ID:MicrostrongAI

公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!

知乎专栏:https://zhuanlan.zhihu.com/Microstrong

Github:https://github.com/Microstrong0305

个人博客:https://blog.csdn.net/program_developer

 题目链接:

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=13&tqId=11180&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述:

解题思路:

如何求出几个字符的所有排列,很多人都不能一下子想出解决方案。那我们是不是可以考虑把这个复杂的问题分解成小的问题呢?比如,我们把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。 在图1中, 我们用两种不同的背景颜色区分字符串的两部分。

我们求整个字符串的排列,可以看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。图1就是分别把第一个字符a和后面的b、c等字符交换的情形。首先固定第一个字符(如图1(a)所示),求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换(如图1(b)所示)...

图1:求字符串的排列的过程

注:(a)把字符串分为两部分,一部分是字符串的第一个字符, 另一部分是第一个字符以后的所有字符(有阴影背景的区域)。 接下来我们求阴影部分的字符串的排列。( b)拿第一个字符和它后面的字符逐个交换。

分析到这里, 我们就可以看出, 这其实是很典型的递归思路。

已经AC的代码:

(1)第一种递归解法:

class Solution:#方法一:递归解法def __init__(self):self.result = []def Permutation(self, ss):# 判断输入if len(ss) == 0:return []self.PermutationCore(ss, 0)sorted(self.result)return self.resultdef PermutationCore(self, str, begin):# 递归结束的条件:第一位和最后一位交换完成if begin == len(str):self.result.append(str)returnfor i in range(begin, len(str)):# 如果字符串相同,则不交换if i != begin and str[i] == str[begin]:continue# 位置交换,Python中字符串的值是不可以修改的,# 可以将字符串转换成列表之后修改值,然后用join组成新字符串。newStr = list(str)temp = newStr[begin]newStr[begin] = newStr[i]newStr[i] = tempstr = ''.join(newStr)# 递归调用,前面begin + 1的位置不变,后面的字符串全排列self.PermutationCore(str, begin + 1)

(2)第二种递归的解法:

 class Solution:# 方法二:递归法的第二种写法def Permutation2(self, ss):if len(ss) <= 0:return []res = list()self.perm(ss, res, '')uniq = list(set(res))return sorted(uniq)def perm(self, ss, res, path):if ss == '':res.append(path)else:for i in range(len(ss)):self.perm(ss[:i]+ss[i+1:], res, path+ss[i])

(3)第三种递归的解法:

这种解法是在牛客网讨论区看到的,代码看着很简洁,但是理解起来很费劲呀!我是看的迷迷糊糊,还是不太懂,先把代码放这里吧!

class Solution:# 方法三:递归法的第三种写法def Permutation3(self, ss):if len(ss) <= 1:return ssres = set()# 遍历字符串,固定第一个元素,第一个元素可以取a,b,c...,然后递归求解for i in range(len(ss)):for j in self.Permutation3(ss[:i] + ss[i + 1:]):  # 依次固定了元素,其他的全排列(递归求解)res.add(ss[i] + j)  # 集合添加元素的方法add(),集合添加去重(若存在重复字符,排列后会存在相同,如baa,baa)return sorted(res)  # sorted()能对可迭代对象进行排序,结果返回一个新的listif __name__ == "__main__":sol = Solution()str = 'abc'print(sol.Permutation3(str))

Reference:

【1】《剑指offer》,何海涛著。

【2】https://cuijiahua.com/blog/2017/12/basis_27.html

【3】https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7?f=discussion

牛客网在线编程专题《剑指offer-面试题28》字符串的排列相关推荐

  1. 牛客网在线编程专题《剑指offer-面试题33》把数组排成最小的数

    我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 微信公众号介绍:Microstrong(小强)同学主要研究机器学习.深度学习.计算机视觉.智能对话系统相关内容, ...

  2. 牛客网在线编程专题《剑指offer-面试题39:题目二》判断是否是平衡二叉树

    题目链接: https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=13&tqId=11192& ...

  3. 牛客网在线编程专题《剑指offer-面试题15》链表中倒数第k个节点

    题目链接: https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167& ...

  4. 剑指Offer - 面试题38. 字符串的排列(全排列,排序,回溯+剪枝)

    1. 题目 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" 输出:["ab ...

  5. 剑指offer面试题38. 字符串的排列(回溯)

    题目描述 **输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素.** 思路 详见链接 代码 class Solution:def permut ...

  6. 牛客网在线编程----算法入门篇

    标题本篇博文主要是记录下自己的在线编程情况,初次练习,有的算法还待改进,大家有需要可以去牛客网上面多练练! 有需戳–>牛客网在线编程 NC65.题目描述 大家都知道斐波那契数列,现在要求输入一个 ...

  7. 剑指offer——面试题28:字符串的排列

    剑指offer--面试题28:字符串的排列 Solution1: 2018年9月2日重做 典型的DFS套路,LeetCode 46 && 47 [46]https://blog.csd ...

  8. 《剑指Offer》面试题四(牛客网在线编程第一题):二维数组中的查找(Java实现)

    题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  9. 牛客网在线编程——二维数组中的查找

    今天是第二次用牛客的在线编程,上次还是去年的七月一号,已然过去近一年的时间,遇到了不少坑,首先题目看错了,没看到数据是有序的,其次就是对二维数组的输入有些不解,是用户手动输入还是现成的,没有说清楚,最 ...

最新文章

  1. OpenResty 通过二级域名做跳转
  2. Lotus Sametime 服务器的安装和配置
  3. java中最容易犯错的特殊字符
  4. C#如何安全、高效地玩转任何种类的内存之Span的秉性特点(二)
  5. Python 推导,内含,迭代器
  6. sqlserver中常用的几个存储过程
  7. Opencv--cvSetImageROI和cvResetImageROI的使用
  8. pads元件类型如何修改_pads logic元件库修改了,怎样更新到原理图
  9. WDA 程序文本翻译OTR
  10. G1垃圾收集器深度剖析
  11. 你心中有这样的人吗?
  12. OC第七节——内存管理
  13. 2020五一建模评测体验
  14. 吉林省教育学院学报杂志社吉林省教育学院学报编辑部2022年第9期目录
  15. python编写密码登录程序_python初学之用户登录的实现过程(实例讲解)
  16. 对抗样本(一)以综述入门
  17. linux 内存强度测试软件,Linux系统性能测试工具(一)——内存带宽测试工具mbw...
  18. 负载阻抗、感抗、容抗
  19. LabVIEW编程LabVIEW开发Fluke8858A/8588A万用表 例程与相关资料
  20. 程序员必备的十四款工具,你都用过吗?

热门文章

  1. “undefined reference to“ 问题汇总及解决方法
  2. 麻花影视,爱观影的请速度下载
  3. 自动化软件测试工作内容,软件测试工程师的主要工作内容
  4. joda-time详解
  5. 抖音直播怎么做?新人直播不冷场的十二技巧
  6. ZOJ 1973 Just Pour the Water(矩阵快速幂)
  7. WIFI 功率计算方式
  8. 百度BML飞桨训练营(十一)paddle-OCR车牌识别
  9. Intel 82579v Gigabit network Server2008 R2网卡驱动
  10. 最新的Adobe Reader X Adobe Reader 9.4.1 奥多比PDF阅读器 简体中文版 绿色安装控台版下载