通过leetcode的查找Longest Palindromic Substring最长回文子串,来学习一下动态规划。

动态规划的核心是能把当前问题分解成已经有的更小的问题,然后直到这个问题有一个常数答案,并且这个分解过程有一个固定模式。

所以最终目的就是寻找 1. 固定的分解模式 2.常数答案。

根据回文串的定义可知,去掉回文串的首位,剩下的依然是回文串,重复这个过程,我们可以得到最终只有长度为1(奇数长度)或者0(偶数长度)的字符串,也就是一个常量解。

因此我们就得到了

  1. 固定的分解模式,及回文串去掉首尾依然是回文串,翻过来,回文串加上相同的首尾依然是回文串。
  2. 常数答案,2.1 一个字符是回文串, 2.2 两个相邻字符如果相同是回文串

假设 s为字符串,i和j表示索引,dp[i][j]=tue/false 分别表示字符串s[i...j]是/否为回文

则 dp[i][j]=dp[i+1][j-1] && s[i]==s[j],及当s[i+1...j-1]是回文且s[i]=s[j]时,那么s[i...j]也是回文,及dp[i][j]=true;

因此可以得到转换方程

if (s.charAt(i) == s.charAt(j)) {
if (j - i <= 2) { //j=i||j=i+1
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
} else {
dp[i][j] = false;
}

实践中有两种写法,一种是从尾向前计算,好处是当在 (i,j) 时,(i+1,j-1) 一定已经被计算,另外一种是从头向后计算,好处是比较直观。

从尾向前:

public String longestPalindrome(String s) {
int n = s.length();
if (n < 2) {
return s;
}
int maxLen = 0;
int maxIndex = 0;
boolean[][] dp = new boolean[n][n]; for (int i = n - 1; i >= 0; i--) {
for (int j = i; j < n; j++) {
if (s.charAt(i) == s.charAt(j)) {
if (j - i <= 2) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
if (dp[i][j] && (j - i + 1 > maxLen)) {
maxLen = j - i + 1;
maxIndex = i;
}
} else {
dp[i][j] = false;
}
}
}
return s.substring(maxIndex, maxIndex + maxLen);
}

从头向后

public String longestPalindrome(String s) {
int n = s.length();
if (n < 2) {
return s;
}
int maxLen = 0;
int maxIndex = 0;
boolean[][] dp = new boolean[n][n]; for (int len = 1; len <= n; len++) {
for (int i = 0; i + len - 1 < n; i++) {
int j = i + len - 1;
if (s.charAt(i) == s.charAt(j)) {
if (j - i <= 2) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
if (dp[i][j] && (j - i + 1 > maxLen)) {
maxLen = j - i + 1;
maxIndex = i;
}
} else {
dp[i][j] = false;
}
}
}
return s.substring(maxIndex, maxIndex + maxLen);
}

Longest Palindromic Substring最长回文子串-学习动态规划Dynamic Programming(DP)的更多相关文章

  1. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

    Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...

  2. LeetCode:Longest Palindromic Substring 最长回文子串

    题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  3. lintcode :Longest Palindromic Substring 最长回文子串

    题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...

  4. [leetcode]5. Longest Palindromic Substring最长回文子串

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  5. 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  6. [LeetCode] 5. Longest Palindromic Substring 最长回文子串

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  7. 【LeetCode】5. Longest Palindromic Substring 最长回文子串

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:最长回文子串,题解,leetcode, 力扣,python ...

  8. 1. Longest Palindromic Substring ( 最长回文子串 )

    要求: Given a string S, find the longest palindromic substring in S. (从字符串 S 中最长回文子字符串.) 何为回文字符串? A pa ...

  9. 【翻译】Longest Palindromic Substring 最长回文子串

    原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...

  10. LeetCode5. Longest Palindromic Substring 最长回文子串 4种方法

    题目链接:https://leetcode.com/problems/longest-palindromic-substring/ 题意很简单,就是求一个字符串得最长子串,这里的子串指连续的. 本文给 ...

随机推荐

  1. Mysql 各种锁摘要

    各种锁 全局锁 FTWRL mysql 通过flush table with read lock 来加全局读锁.使用了FTWRL后整个库只能读,不能个更新和执行DDL,有更新的事务等 用处: 逻辑备份 ...

  2. 03_Redis之常用命令

    03_Redis之常用命令 键值相关命令 # 查看当前数据库有哪些key值 keys * # 确认一个key是否存在 exists key # 删除key值 del key # 设置某个key的过期时 ...

  3. 【iOS】iOS警告收录与消除方法

    原文转自:董铂然 原文较老,对其中的代码做了部分修改 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下 ...

  4. SQL 实例 - RIGHT JOIN 关键字

      select * from websites; INSERT INTO `access_log` (`aid`, `site_id`, `count`, `date`) VALUES ('10', ...

  5. 漏洞详解--XXE 从入门到精通!

    一.漏洞原理 1.1 核心 XXE(XML External Entity injection),名为XML外部实体注入.其核心在于XML解析器默认允许外部实体/DTD,攻击者通过构造特殊的XML使其 ...

  6. [MCP][07]logging和progress等功能说明

    前言 截至目前(2025年9月19日),除了基础的Prompt.Resource和Tool概念,FastMCP还提供了以下功能:Sampling.Elicitation.Logging.Progres ...

  7. Intel NUC5安装Kinect驱动踩坑

    继续de之前那个没搞定的bug,真的是太烦人了 这边有一套详细的问答,和我一样把问题确认在libva上面 https://github.com/OpenKinect/libfreenect2/issu ...

  8. 使用 Copilot AI + Blazor 编一个五子棋游戏

    1. 创建 Blazor web工程,选Auto 2. 打开 GitHub Copilot 窗口,输入提示词 使用 Blazor 编一个五子棋游戏 3.复制代码测试 为了方便调试, 我们先把运行模式由 ...

  9. 视频信号检测板卡:208-Base Camera Link 图像信号模拟器

    Base Camera Link 图像信号模拟器 1.板卡概述 该板卡是基于Altra FPGA处理芯片EP3C40F484C8(兼容EP3C16F484C8),模拟产生自定义分辨率的Camera L ...

  10. Spring AOP、MVC高频面试题解析

    什么是AOP? 面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理.日志.缓存等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度.切面就是那些与业务无关,但所有业 ...