leetcode hot100 131. 分割回文串 medium 递归回溯

回文字符串是指:

从左往右读和从右往左读完全一样的字符串。

coffeescript 复制代码
s == s[::-1]

切片回溯

coffeescript 复制代码
start=0
 ├─ "a"
 │    ├─ "a"
 │    │    └─ "b"
 └─ "aa"
      └─ "b"

整个递归路径

coffeescript 复制代码
class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = []
        n = len(s)

        # start 从s的start索引开始切。之前的已经切好了(是回文),剩下的从这里开始切
        # tmp 列表,记录了从字符串开头到当前位置,已经切出来的所有回文子串。
        def backtrack(start, tmp):  # 切片起始位置,待选排列
            # 切到末尾  整串已经被成功分割完
            if start == n:
                res.append(tmp)
                return

            # 枚举切割位置
            for i in range(start, n):
                sub = s[start:i+1]  # 切片
                if sub == sub[::-1]:  # 如果当前这段是回文,才允许继续往后切
                    backtrack(i+1, tmp + [sub])  # 传新列表

        backtrack(0, [])  # 切片起始位置,字符串
        return res

时间复杂度:O(N⋅2N)O(N \cdot 2^N)O(N⋅2N)

字符串有 N−1N-1N−1 个可能的切割位置,每个位置切或不切,共有 2N2^N2N 种分割方式。每次判断回文需要 O(N)O(N)O(N)。

空间复杂度:O(N2)O(N^2)O(N2)

主要是递归栈的深度和存储中间状态。

相关推荐
To_OC6 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎7 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC7 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
tachibana218 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
晚笙coding20 小时前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展
兰令水21 小时前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
退休倒计时1 天前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript
旖-旎2 天前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
良木林2 天前
滑动窗口 - LeetCode hot 100
javascript·算法·leetcode·双指针·滑动窗口
晚笙coding2 天前
LeetCode 108:将有序数组转换为二叉搜索树 —— 从数组到平衡二叉树的递归构造
数据结构·算法·leetcode