力扣131-分割回文串

131. 分割回文串 - 力扣(LeetCode)

给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

示例 1:

输入: s = "aab"

**输出:[["a","a","b"],["aa","b"]]

示例 2:

输入: s = "a"

**输出:[["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

如果已经在某个位置切了一刀,那么接着只需要考虑这个位置后面的子串怎么切,这就有点"问题与子问题"的意思在了,可以写一个 dfs 函数,dfs(i) 表示字符串 s 未分割的部分是从下标 i 开始到字符串末尾,那么递归终止条件是 i == n

接着再看[i, n - 1]这部分子串,要在哪切?显然必须要从 i 开始往后枚举每个位置,看看这个位置 j 能否与起点 i 构成回文串。如果不行就继续往后枚举;如果可以,那么就将这个回文串加入答案,然后从 j + 1 开始往后找回文串,也就是调用 dfs(j + 1),dfs(j + 1) 返回后,把本次加入答案的结果弹出(因为一直递归调用 dfs 必然能走到 i == n 的时候,此时 path 会被加入到 ans 中),然后继续循环

也就是说,dfs 递归调用控制的是切几刀,递归深度越深,切的刀数就越多,因为一直在前面已经切了的基础上往后切。遍历控制的是在哪切,在当前刀数一定的情况下,往后找分割的位置

python 复制代码
from typing import List

def partition(s: str) -> List[List[str]]:
    ans = []
    path = []
    n = len(s)

    def dfs(i: int) -> None:
        # dfs(i) 表示 s 未分割的部分为 [i,n - 1]
        if i == n:
            # 不能用 ans.append("".join(path)),否则无法 pop
            ans.append(path.copy())
            return
        # 枚举终点
        for j in range(i, n):
            substr = s[i: j + 1] # 把子串分割出来
            if substr == substr[::-1]:
                # 如果是回文串
                path.append(substr)
                dfs(j + 1) # 从当前回文串的终点的后一个位置开始往后找新的串
                path.pop() # 恢复现场
    dfs(0)
    return ans

def main():
    with open("case.txt", "r") as f:
        ss = f.read().split()

    for s in ss:
        result = partition(s)
        print(f"s = {s}")
        print(result)
        print()

if __name__ == "__main__":
    main()
相关推荐
实验如有神祝女士15 小时前
不同参数规模大模型在医学翻译场景的适配差异
论文阅读·人工智能·深度学习·学习·算法·语言模型·论文笔记
windliang15 小时前
Claude Code 源码分析(三):一次模型回答如何流进 Agent
前端·算法·ai编程
Kyrie_kk17 小时前
Java--BigInteger 超大整数计算
java·算法
汽车网络安全爱好者17 小时前
Public Key Infrastructure(二)— 深入理解 X.509 证书:从 RFC 5280 到 OpenSSL 实践
运维·服务器·算法·网络安全·汽车·密码学·可信计算技术
BioRunYiXue18 小时前
技术干货 | LiP-MS全流程解析:从实验设计到数据分析
大数据·前端·javascript·人工智能·算法·数据挖掘·数据分析
Jasmine_llq18 小时前
《P11246 [GESP202409 六级] 小杨和整数拆分》
算法·数学定理版本·时间复杂度n1/2·dp 版本
湿滑路面18 小时前
VideoPipe中集成多模态大模型做视频(图片)分析
人工智能·算法·音视频
井川廊咏19 小时前
使用typedef封装函数指针新类型
算法
fīɡЙtīиɡ ℡19 小时前
分布式ID生成策略
java·分布式·算法