📜  查找字符串的所有排列 (1)

📅  最后修改于: 2023-12-03 14:55:33.773000             🧑  作者: Mango

查找字符串的所有排列

给定一个字符串,编写一个函数来计算字符串中所有字符的排列组合。

示例

输入: "abc"

输出: ["abc","acb","bac","bca","cab","cba"]

解法

将字符串看做一个有序数组,根据全排列的定义,先列出第一个数的所有可能,即把第一个数依次与后面的所有数交换;然后固定第一个数,求后面的数的全排列,这个时候还可以和后面的数交换,以此类推。

class Solution:
    def permutation(self, s: str) -> List[str]:
        if not s: return []
        res = []
        chars = list(s) # 转为字符数组
        n = len(chars)

        def dfs(pos: int):
            if pos == n - 1:
                res.append(''.join(chars))
                return
            used = set()
            for i in range(pos, n):
                if chars[i] in used: continue
                used.add(chars[i])
                chars[pos], chars[i] = chars[i], chars[pos]
                dfs(pos + 1)
                chars[pos], chars[i] = chars[i], chars[pos]

        dfs(0)
        return res
复杂度分析

时间复杂度:O(N!),其中 N 为字符串的长度。

空间复杂度:O(N),其中 N 为字符串的长度。我们需要 O(N) 的标记数组、O(N) 的递归栈空间,以及 O(N!) 的结果空间。