当前位置: 首页 > article >正文

LeetCode刷题笔记:用动态规划一口气搞定6道回文串问题(附Java代码)

动态规划解回文问题从子串到子序列的通用解法回文串问题在算法面试中出现的频率居高不下无论是统计回文子串数量、寻找最长回文子串还是处理回文子序列动态规划(DP)都是解决这类问题的利器。本文将带你系统掌握六种经典回文问题的动态规划解法通过对比分析它们的共性与差异形成一套可复用的解题框架。1. 动态规划解回文问题的核心思路动态规划解回文问题的关键在于状态定义和状态转移方程的建立。我们先从一个基础问题入手逐步扩展到更复杂的场景。1.1 回文子串的基本DP解法对于判断子串是否为回文最常用的DP方法是构建一个二维数组dp[i][j]表示字符串从索引i到j的子串是否为回文。状态转移方程如下if (s[i] s[j]) { dp[i][j] dp[i1][j-1]; // 取决于内部子串 } else { dp[i][j] false; }边界条件单个字符dp[i][i] true两个相同字符dp[i][i1] true1.2 填表顺序的技巧由于dp[i][j]依赖于dp[i1][j-1]我们需要从下往上、从左往右填表for (int i n - 1; i 0; i--) { for (int j i; j n; j) { // 填充dp[i][j] } }这种填表顺序确保了在计算dp[i][j]时dp[i1][j-1]已经被计算过。2. 统计回文子串数量LeetCode 6472.1 问题描述给定一个字符串计算其中回文子串的总数。具有不同起始或结束位置的子串即使由相同的字符组成也会被视作不同的子串。2.2 解法优化在基础DP解法上稍作修改统计所有dp[i][j]为true的情况public int countSubstrings(String s) { int n s.length(); boolean[][] dp new boolean[n][n]; int count 0; for (int i n - 1; i 0; i--) { for (int j i; j n; j) { if (s.charAt(i) s.charAt(j)) { dp[i][j] (j - i 2) || dp[i 1][j - 1]; } if (dp[i][j]) count; } } return count; }提示对于长度≤2的子串可以直接判断是否为回文无需查看内部子串。3. 寻找最长回文子串LeetCode 53.1 问题升级在统计回文子串的基础上我们需要记录最长回文的起始位置和长度。3.2 代码实现public String longestPalindrome(String s) { int n s.length(); boolean[][] dp new boolean[n][n]; int maxLen 0; int start 0; for (int i n - 1; i 0; i--) { for (int j i; j n; j) { if (s.charAt(i) s.charAt(j)) { dp[i][j] (j - i 2) || dp[i 1][j - 1]; } if (dp[i][j] j - i 1 maxLen) { maxLen j - i 1; start i; } } } return s.substring(start, start maxLen); }3.3 复杂度分析指标值时间复杂度O(n²)空间复杂度O(n²)最优解Manacher算法(O(n))4. 回文子序列问题LeetCode 5164.1 问题差异与回文子串不同子序列不要求字符连续。这导致状态转移方程有所变化if (s[i] s[j]) { dp[i][j] 2 dp[i1][j-1]; } else { dp[i][j] Math.max(dp[i1][j], dp[i][j-1]); }4.2 完整实现public int longestPalindromeSubseq(String s) { int n s.length(); int[][] dp new int[n][n]; for (int i n - 1; i 0; i--) { dp[i][i] 1; for (int j i 1; j n; j) { if (s.charAt(i) s.charAt(j)) { dp[i][j] 2 dp[i 1][j - 1]; } else { dp[i][j] Math.max(dp[i 1][j], dp[i][j - 1]); } } } return dp[0][n - 1]; }4.3 关键区别特征回文子串回文子序列连续性必须连续可以不连续DP值类型booleanint状态转移依赖内部子串取左右最大值5. 回文分割问题LeetCode 1325.1 问题描述给定一个字符串将字符串分割成一些子串使每个子串都是回文返回符合要求的最少分割次数。5.2 双重DP解法先用DP预处理所有可能的回文子串再用DP计算到每个位置的最小分割次数public int minCut(String s) { int n s.length(); boolean[][] isPal new boolean[n][n]; int[] dp new int[n]; // 预处理回文信息 for (int i n - 1; i 0; i--) { for (int j i; j n; j) { if (s.charAt(i) s.charAt(j) (j - i 2 || isPal[i 1][j - 1])) { isPal[i][j] true; } } } // 计算最小分割 for (int i 0; i n; i) { if (isPal[0][i]) { dp[i] 0; } else { dp[i] i; // 初始化为最大可能分割次数 for (int j 0; j i; j) { if (isPal[j 1][i]) { dp[i] Math.min(dp[i], dp[j] 1); } } } } return dp[n - 1]; }注意预处理回文信息可以避免在计算最小分割时重复判断子串是否为回文。6. 构建回文的最小插入次数LeetCode 13126.1 问题转化这个问题可以转化为求字符串与其反转字符串的最长公共子序列(LCS)然后用字符串长度减去LCS长度。6.2 DP解法public int minInsertions(String s) { int n s.length(); int[][] dp new int[n][n]; for (int i n - 1; i 0; i--) { for (int j i 1; j n; j) { if (s.charAt(i) s.charAt(j)) { dp[i][j] dp[i 1][j - 1]; } else { dp[i][j] Math.min(dp[i 1][j], dp[i][j - 1]) 1; } } } return dp[0][n - 1]; }6.3 解题思路对比问题类型解题关键DP表含义回文子串统计判断所有子串是否为回文最长回文子串记录最大长度是否为回文回文子序列不连续字符最长长度回文分割预处理分割DP最小分割数构建回文逆向思考最小操作数7. 综合应用与解题模板通过分析以上问题我们可以总结出一个通用的DP解回文问题的框架确定DP表含义根据问题选择boolean或int类型初始化边界条件单个字符或两个字符的情况确定填表顺序通常从下往上、从左往右状态转移方程对于子串问题dp[i][j] (s[i]s[j]) dp[i1][j-1]对于子序列问题考虑字符相等和不相等两种情况根据问题需求处理结果统计数量、记录最大值、计算最小值等7.1 代码模板public int solvePalindromeProblem(String s) { int n s.length(); // 1. 定义DP表 int[][] dp new int[n][n]; // 或 boolean[][] // 2. 填表 for (int i n - 1; i 0; i--) { for (int j i; j n; j) { // 3. 处理边界条件 if (i j) { dp[i][j] 1; // 或 true continue; } // 4. 状态转移 if (s.charAt(i) s.charAt(j)) { // 根据问题类型实现不同逻辑 } else { // 根据问题类型实现不同逻辑 } } } // 5. 返回结果 return dp[0][n - 1]; // 或其他处理 }7.2 常见变种与应对策略空间优化有些问题可以将二维DP优化为一维预处理技巧对于复杂问题可以先预处理回文信息反向思考如最小插入次数问题可以转化为求最长回文子序列多步DP像分割问题可能需要多个DP表协同工作在实际面试中理解这些问题的共性和差异能够快速识别问题类型并套用相应模板可以显著提高解题效率。建议按照本文的顺序练习这些问题体会动态规划解回文问题的精妙之处。

相关文章:

LeetCode刷题笔记:用动态规划一口气搞定6道回文串问题(附Java代码)

动态规划解回文问题:从子串到子序列的通用解法 回文串问题在算法面试中出现的频率居高不下,无论是统计回文子串数量、寻找最长回文子串,还是处理回文子序列,动态规划(DP)都是解决这类问题的利器。本文将带你系统掌握六种经典回文问…...

VMware16虚拟机扩容实战:Ubuntu22.04磁盘空间不足的终极解决方案

VMware16虚拟机扩容实战:Ubuntu22.04磁盘空间不足的终极解决方案 当你全神贯注地在Ubuntu22.04虚拟环境中开发项目时,突然弹出的"磁盘空间不足"警告足以让任何开发者心头一紧。特别是在使用VMware16这类虚拟化平台时,初始分配的磁盘…...

C语言实战:用栈结构解析括号匹配的三种典型错误

1. 为什么括号匹配是编程基本功 刚学C语言那会儿,我最怕遇到段错误(Segmentation Fault)。有次调试了整整两天,最后发现是少写了个右花括号。这种痛只有程序员才懂——括号就像代码的标点符号,漏一个整个程序就崩溃了。 用栈处理括号匹配之所…...

Java实战:手把手教你给JPG、PNG、GIF图片批量添加AIGC隐式水印(附完整代码)

Java实战:批量处理图片隐式水印的工程化解决方案 在数字内容爆炸式增长的时代,如何有效标识和管理AIGC生成内容成为开发者面临的新挑战。本文将深入探讨Java环境下批量处理JPG、PNG、GIF图片隐式水印的完整技术方案,从原理分析到实战代码&…...

Manifold快速入门指南:如何在5分钟内开始使用这个强大的Java工具

Manifold快速入门指南:如何在5分钟内开始使用这个强大的Java工具 【免费下载链接】manifold Manifold is a Java compiler plugin, its features include Metaprogramming, Properties, Extension Methods, Operator Overloading, Templates, a Preprocessor, and m…...

立创泰山派RK3566开发板串口调试:从1500000到115200的保姆级修改指南

立创泰山派RK3566开发板串口调试:从1500000到115200的保姆级修改指南 刚拿到立创泰山派RK3566开发板时,很多开发者都会遇到一个令人头疼的问题——默认的串口波特率高达1500000bps,而市面上大多数串口调试工具根本不支持这个速率。这就像拿到…...

OpenDrop用户画像分析:揭秘不同用户群体的文件传输习惯与使用场景

OpenDrop用户画像分析:揭秘不同用户群体的文件传输习惯与使用场景 【免费下载链接】opendrop An open Apple AirDrop implementation written in Python 项目地址: https://gitcode.com/gh_mirrors/op/opendrop OpenDrop是一个开源Apple AirDrop实现&#xf…...

如何利用Location类实现代码审查的精准定位:提升团队协作效率的3个实用技巧

如何利用Location类实现代码审查的精准定位:提升团队协作效率的3个实用技巧 【免费下载链接】ReflectionCommon 项目地址: https://gitcode.com/gh_mirrors/re/ReflectionCommon 在现代软件开发中,代码审查是保证代码质量的关键环节,…...

C++游戏开发实战:从零构建局域网联机对战系统(附完整代码解析)

1. 为什么选择C开发局域网联机游戏? 用C做游戏联机功能就像给汽车装涡轮增压——虽然需要点技术含量,但跑起来是真的爽。我十年前第一次用C写联机坦克大战时,看着两台电脑上的坦克同步开火,那种成就感至今难忘。 性能优势是首要原…...

ui-ux设计新手福音:用快马生成可运行代码,直观掌握pro-max级界面构建

作为一个刚接触UI/UX设计的新手,我常常被各种设计规范和交互逻辑搞得晕头转向。直到发现了InsCode(快马)平台,它让我通过可运行的代码示例,直观理解了专业级界面构建的全过程。今天就用一个用户登录注册界面的案例,分享我的学习心…...

Nodejs零基础入门指南:用快马AI生成你的第一个命令行工具

Nodejs零基础入门指南:用快马AI生成你的第一个命令行工具 作为一个刚接触Node.js的新手,我一直在寻找一个简单又有趣的入门项目。最近发现InsCode(快马)平台的AI生成功能特别适合学习,它能根据我的需求描述直接生成可运行的代码,…...

实战派必备:基于快马平台打造全能型ventoy系统救援启动盘

实战派必备:基于快马平台打造全能型ventoy系统救援启动盘 最近在折腾系统维护工具时,发现ventoy真是个神器。它不仅能同时装多个系统镜像到一个U盘,还能自定义菜单和工具包。不过网上的ventoy教程大多只教基础用法,真正适合实战的…...

用快马ai快速构建你的第一个endnote式文献管理原型

最近在写论文时,突然意识到需要个简单的文献管理工具。虽然EndNote这类专业软件功能强大,但对于快速记录和引用参考文献来说,有时候只需要一个轻量级的解决方案。于是我在InsCode(快马)平台上尝试用HTML、CSS和JavaScript快速搭建了一个原型&…...

利用快马AI快速生成产区标准可视化地图原型

最近在做一个农业规划项目,需要展示不同等级产区的分布和标准。传统做法是用PPT贴静态地图,每次修改都要重做,特别麻烦。后来发现用InsCode(快马)平台可以快速搭建交互式地图应用,效果出乎意料的好。 地图底图选择 中国地图最常用…...

4个维度掌握bilibili-parse:从入门到精通

4个维度掌握bilibili-parse:从入门到精通 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 在数字内容开发领域,高效获取视频资源是许多项目的基础需求。视频解析工具作为连接内…...

3个高效方案解决Kindle电子书封面不显示问题:Fix-Kindle-Ebook-Cover完全指南

3个高效方案解决Kindle电子书封面不显示问题:Fix-Kindle-Ebook-Cover完全指南 【免费下载链接】Fix-Kindle-Ebook-Cover A tool to fix damaged cover of Kindle ebook. 项目地址: https://gitcode.com/gh_mirrors/fi/Fix-Kindle-Ebook-Cover Fix-Kindle-Ebo…...

万象视界灵坛从零开始:开源多模态平台GPU算力适配与显存调优指南

万象视界灵坛从零开始:开源多模态平台GPU算力适配与显存调优指南 1. 平台概述与核心价值 万象视界灵坛是一款基于OpenAI CLIP模型的高级多模态智能感知平台,它将复杂的语义对齐任务转化为直观的像素风格交互体验。平台采用CLIP-ViT-L/14作为核心模型&a…...

洛雪音乐音源:全网无损音乐一键获取的完整指南

洛雪音乐音源:全网无损音乐一键获取的完整指南 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 还在为音乐平台会员费烦恼吗?想要免费畅听全网无损音乐吗?洛雪音…...

利用codex与快马平台,十分钟快速生成待办事项应用原型

最近在尝试快速验证一个待办事项应用的想法,发现用InsCode(快马)平台配合AI模型真的能十分钟就搞出可运行的原型。整个过程特别适合像我这样想快速验证产品概念的人,记录下具体操作和思考过程。 明确核心功能需求 首先梳理出最简功能清单:输入…...

突破TIDAL音乐离线限制:tidal-dl-ng四象限应用指南

突破TIDAL音乐离线限制:tidal-dl-ng四象限应用指南 【免费下载链接】tidal-dl-ng TIDAL Media Downloader Next Generation! Up to HiRes / TIDAL MAX 24-bit, 192 kHz. 项目地址: https://gitcode.com/gh_mirrors/ti/tidal-dl-ng 场景痛点:当高品…...

Windows Btrfs驱动:在Windows系统上使用Btrfs文件系统的完整专业指南

Windows Btrfs驱动:在Windows系统上使用Btrfs文件系统的完整专业指南 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs WinBtrfs是一个开源项目,旨在为Windows系统…...

终极指南:如何使用Rails API构建安全高效的无状态认证系统 [特殊字符]

终极指南:如何使用Rails API构建安全高效的无状态认证系统 🚀 【免费下载链接】rails-api Rails for API only applications 项目地址: https://gitcode.com/gh_mirrors/ra/rails-api Rails API是专为构建纯API应用而设计的轻量级Rails框架&#…...

Hogan.js Lambda功能详解:高级模板替换技术终极指南

Hogan.js Lambda功能详解:高级模板替换技术终极指南 【免费下载链接】hogan.js A compiler for the Mustache templating language 项目地址: https://gitcode.com/gh_mirrors/ho/hogan.js Hogan.js是一个高效的Mustache模板引擎编译器,它提供了强…...

Pop Shell浮动窗口配置终极指南:如何让特定应用始终保持浮动状态

Pop Shell浮动窗口配置终极指南:如何让特定应用始终保持浮动状态 【免费下载链接】shell Pop!_OS Shell 项目地址: https://gitcode.com/gh_mirrors/sh/shell Pop!_OS Shell(简称Pop Shell)是一款为Linux桌面环境设计的高效窗口管理工…...

如何用Hogan.js自动生成模板文档:提升项目维护效率的终极指南

如何用Hogan.js自动生成模板文档:提升项目维护效率的终极指南 【免费下载链接】hogan.js A compiler for the Mustache templating language 项目地址: https://gitcode.com/gh_mirrors/ho/hogan.js Hogan.js是一款高效的Mustache模板语言编译器,…...

如何快速构建全响应式应用:Reactor Core 与 WebFlux 集成终极指南

如何快速构建全响应式应用:Reactor Core 与 WebFlux 集成终极指南 【免费下载链接】reactor-core Non-Blocking Reactive Foundation for the JVM 项目地址: https://gitcode.com/gh_mirrors/re/reactor-core 在当今高并发、低延迟的微服务架构时代&#xff…...

7个智能功能让暗黑2重制版刷装效率提升300%:Botty自动化助手完全指南

7个智能功能让暗黑2重制版刷装效率提升300%:Botty自动化助手完全指南 【免费下载链接】botty D2R Pixel Bot 项目地址: https://gitcode.com/gh_mirrors/bo/botty 你是否厌倦了《暗黑破坏神2:重制版》中重复刷怪、捡装备的枯燥过程?Bo…...

通义千问3-Embedding-4B一键部署:5分钟搭建知识库向量化服务

通义千问3-Embedding-4B一键部署:5分钟搭建知识库向量化服务 1. 为什么选择Qwen3-Embedding-4B 1.1 模型核心优势 Qwen3-Embedding-4B是阿里通义千问系列中专注于文本向量化的4B参数双塔模型,具有以下突出特点: 高效能低消耗:…...

BilibiliDown:5分钟学会高效下载B站视频的完整指南

BilibiliDown:5分钟学会高效下载B站视频的完整指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/B…...

Docker+宝塔:零基础在Mac上快速搭建PHP开发环境

1. 为什么选择Docker宝塔组合? 作为一个在Mac上折腾过各种开发环境的老手,我强烈推荐Docker宝塔这个黄金组合。你可能听说过宝塔面板在Linux服务器上的强大功能,但官方并没有提供Mac版本。这时候Docker就像个魔术师,能让我们在Mac…...