📜  | |第 46 题(1)

📅  最后修改于: 2023-12-03 15:21:24.593000             🧑  作者: Mango

| 第 46 题 |
问题描述

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例

输入: "aab" 输出:

[
  ["aa","b"],
  ["a","a","b"]
]
解题思路

回溯算法

将字符串从左往右依次截取,判断子串是否为回文字符。

若是回文字符,则将子串加入结果数组中,然后递归截取后面的字符串,将后面截取的子串加入结果数组中,直到整个字符串都被截取完毕,这时就获得了一组结果。

如果当前子串不是回文字符,则直接递归截取后面的字符串。

代码实现
class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = []
        path = []

        def isPalindrome(left, right):
            while left < right:
                if s[left] != s[right]:
                    return False
                left += 1
                right -= 1
            return True

        def backtrack(start):
            if start == len(s):
                res.append(list(path))
                return

            for i in range(start, len(s)):
                if isPalindrome(start, i):
                    path.append(s[start:i+1])
                    backtrack(i+1)
                    path.pop()

        backtrack(0)
        return res
复杂度分析

时间复杂度:O(n×2^n)

最坏情况下,回溯算法需要遍历所有可能的情况,其中有 O(2^n) 个叶节点,每个叶节点需要 O(n) 的时间来复制一组答案,因此总时间复杂度为 O(n×2^n)。

空间复杂度:O(n)

递归栈的深度最大为 n,因此空间复杂度为 O(n)。