剑指Offer38-字符串的排列

剑指Offer38-字符串的排列

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:


输入:s = "abc"

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

限制:

1 <= s 的长度 <= 8

来源:力扣(LeetCode)

链接:力扣

一解

使用回溯法,以 s="abc" 为例:

先随机固定(通过交换实现:c[i], c[x] = c[x], c[i])第一个字母: a 或 b 或 c:

然后固定第二个字母:


class Solution:

    def permutation(self, s: str) -> List[str]:

        c, res = list(s), []

        def dfs(x):

            if x == len(c) - 1:

                res.append("".join(c))

                return

            dic = set()

            for i in range(x, len(c)):

                # 如果出现重复,进行剪枝

                # 比如 aaaab

                if c[i] in dic:

                    continue

                dic.add(c[i])

                # 进行随机固定

                c[i], c[x] = c[x], c[i]

                dfs(x + 1)

                # 恢复固定

                c[i], c[x] = c[x], c[i]

        dfs(0)

        return res