剑指 Offer 38. 字符串的排列

133 阅读1分钟

题目描述

输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例: 输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"]

解题思路: 递归回溯法

  1. 这是一个排列的问题, 我们可以直接使用回溯来做
  2. 每次递归记录已经遍历过的item, 当长度与字符串相同时, 表示遍历到了一个组合, 加入result, 进行下次遍历
  3. 每次递归除了当前元素以外的其他所有元素list, 进行排列组合
  4. 递归以后将加入的值删除进行回溯

注: 因为结果不能重复, 所以我们考虑使用set来存储, 做到过滤重复值

示例代码

def permutation(self, s: str) -> [str]:
    def backCall(path, list):
        if len(path) == len(s):
            result.add("".join(path))
            return
        for i in range(0, len(list)):
            item = list[i]
            path.append(item)
            backCall(path, list[:i] + list[i + 1 :])
            path.pop()

    result = set()
    backCall([], list(s))

    return list(result)