剑指offer第二版(Python3)--面试题38 : 字符串的排列

第2章 面试需要的基础知识

第3章 高质量的代码

第4章 解决面试题的思路

  面试题27:二叉树的镜像
  面试题29:顺时针打印矩阵
  面试题30 :包含min函数的栈
  面试题31:栈的压入、弹出序列
  面试题32:上往下打印二叉树
  面试题33: 二叉搜索树的后序遍历序列
  面试题34: 二叉树中和为某一值的路径
  面试题35:复杂链表的复制
  面试题36:二叉搜索树与双向链表
  面试题38:字符串的排列

第5章 优化时间和空间效率

第6章 面试中的各项能力

第7章 两个面试案例


题目描述
  输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

解题思路
  解题分为两步:

  1. 第一步求所有可能出现在第一个位置的字符;
  2. 第二步固定第一个字符,求后面所有字符的排列。

  求后面所有字符的排列可以使用递归。把后面所有字符分为两部分:后面字符的第一个字符,以及这个字符之后的所有字符,然后递归使用前面的两步法即可。

以abc为例:
固定a,剩下bc;
bc中固定b,剩下c;固定c,剩下b;所以bc的排列有bc,cb两种。
所以a为第一位时,有abc,acb两种。

同理b为第一位时,有bac,bca两种。
c为第一位时,有cba,cab两种。

实战

def Permutation(ss):
    # write code here
    if not ss:
        return []

    def recc(beg, string):
        if beg == len(string) - 1:
            res.add(''.join(string))
        for i in range(beg, len(string)):
            string[i], string[beg] = string[beg], string[i]
            recc(beg + 1, string)
            string[i], string[beg] = string[beg], string[i]

    res = set()
    recc(0, list(ss))
    return sorted(list(res))

第二种写法:

class Solution:
    def Permutation(self, ss):
        # write code here
        if not ss:
            return []
        
        def recc(string, s):
            if not string:
                res.add(s)
            for i in range(len(string)):
                recc(string[:i]+string[i+1:], s+string[i])
            
        res = set()
        recc(ss, '')
        return sorted(list(res))

拓展:
  字符串的组合。
  abc的组合有a,b,c,ab,ac,abc。ab和ba是同一种组合,不同种排列。

实战

def Permutation(ss):
    # write code here
    if not ss:
        return []

    def recc(string, s):
        if s:
            res.add(s)
        for i in range(len(string)):
            recc(string[i+1:], s + string[i])

    res = set()
    recc(ss, '')
    return sorted(list(res))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值