剑指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))

你可能感兴趣的:(算法设计)