(python version) 劍指offer 38. 字符串的排列

题目描述

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
來源:力扣(LeetCode)
(python version) 劍指offer 38. 字符串的排列_第1张图片

解题思路

难度是 medium,归类在『分解复杂问题简单化』

  • 按照解决问题的步骤来分解复杂问题,每一步解决一个小问题。

  • 寻找字符串排列的规律:

    • abc & abcd 两个例子来看
    • abc 而言,可将遍历的 a, b, c 作为首字母,并与剩下的字母排列组合。举例:以a + {b.c} 形成的排列组合; b + {a,c} 形成的排列組合; c+ {b,a} 形成的排列组合。
    • 若扩展至 abcd ,在子函数 self.p_order() 当中,ss 代表待排列字符例如 d ,path 为首字符例如 abc,当待排列字符为空时(例如当 ss == ‘’ ),path 此时变为 abcd ,則可以 append 回 res。
    • 最後再返回所有結果時,利用 set() 去除重複。
  • 方法二的思路更为直接,同样是以首字符+后续字符排列形成的排列组合。但时间复杂度大于方法一。

  • 思路图示参考连结:http://www.jeepxie.net/article/195551.html
    (python version) 劍指offer 38. 字符串的排列_第2张图片

Python代码

# 方法一
class Solution():
    def permutation(self,s):
        res = []
        if not s:
            return res
        self.p_order(s, res, '')
        return list(set(res))
    
    def p_order(self, ss, res, path):
        """
        :param ss:   其他字符
        :param res:
        :param path: 前面字符
        """
        if ss == '':
            res.append(path)
            
        for i in range(len(ss)):
            self.p_order(ss[:i]+ss[i+1:], res, path+ss[i])


# 方法二
class Solution:
    def permutation(self, s):
        # 第一个字符以后的排列 是一个小问题
        if len(s) == 1:
            return [s]
        res = []
        for i in range(len(s)):
            mid_res = self.permutation(s[:i] + s[i+1:] )
            for m in mid_res:
                mix = s[i]+m
                res.append(mix)
        return list(set(res))

你可能感兴趣的:(字符串,数据结构,算法)