Longest Palindromic Substring最长回文子串-学习动态规划Dynamic Programming(DP)
通过leetcode的查找Longest Palindromic Substring最长回文子串,来学习一下动态规划。
动态规划的核心是能把当前问题分解成已经有的更小的问题,然后直到这个问题有一个常数答案,并且这个分解过程有一个固定模式。
所以最终目的就是寻找 1. 固定的分解模式 2.常数答案。
根据回文串的定义可知,去掉回文串的首位,剩下的依然是回文串,重复这个过程,我们可以得到最终只有长度为1(奇数长度)或者0(偶数长度)的字符串,也就是一个常量解。
因此我们就得到了
- 固定的分解模式,及回文串去掉首尾依然是回文串,翻过来,回文串加上相同的首尾依然是回文串。
- 常数答案,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)的更多相关文章
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- lintcode :Longest Palindromic Substring 最长回文子串
题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...
- [leetcode]5. Longest Palindromic Substring最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- [LeetCode] 5. Longest Palindromic Substring 最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- 【LeetCode】5. Longest Palindromic Substring 最长回文子串
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:最长回文子串,题解,leetcode, 力扣,python ...
- 1. Longest Palindromic Substring ( 最长回文子串 )
要求: Given a string S, find the longest palindromic substring in S. (从字符串 S 中最长回文子字符串.) 何为回文字符串? A pa ...
- 【翻译】Longest Palindromic Substring 最长回文子串
原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...
- LeetCode5. Longest Palindromic Substring 最长回文子串 4种方法
题目链接:https://leetcode.com/problems/longest-palindromic-substring/ 题意很简单,就是求一个字符串得最长子串,这里的子串指连续的. 本文给 ...
随机推荐
- Unity 接入腾讯云COS对象存储
网上没找到COS对应.net新版本的教程,就踩完记录下来 首先注册腾讯云巴拉巴拉,下载.net sdk巴拉巴拉 放到Unity项目中,删掉不必要的测试模块,剩下的如下图 然后建立一个测试脚本,代码如下 ...
- 无人机RTMP推流直播及无人机GBR24视频流推流直播解决方案
LiveQing云端直播点播流媒体软件: 提供设备接入: RTMP推流服务.RTMP分发.HLS分发.HTTP-FLV分发: 云端录像.云端录像检索.云端录像点播.云端录像下载: RTMP转推.推流鉴 ...
- 使用LiveGBS将GB28181流转成RTSP流上大屏
GB28181国标协议规定了流的输出格式为 RTP + PS 形式, 但是在很多场景下(比如视频分析), 我们可能需要的是 RTSP 这类格式的流数据, 基于 RTSP 的播放器,分发服务器比较成熟广 ...
- 创建mdbook和gitbook文档:脚手架
mdbook: https://github.com/AgoCan/code-generator/blob/main/docs/mdbook.md gitbook: https://github.co ...
- Oracle打开审计
0.审计安装11g默认是开始审计的,有审计记录,所以不需要安装,如果查询发现表不存在,则需要安装.使用此命令安装即可,安装完成后重启数据库.SQL> @/u01/app/oracle/produ ...
- 简易数字电压表+ADC0809+程序查询方式实现8路数据转换
1 实验现象(每间隔1s自动切换模拟信号采集通道,通过数码管显示测量的电压值) 2 硬件设计 3 程序设计 3.1 主函数 #include <REG52.H> #include &quo ...
- SQL 实例 - RIGHT JOIN 关键字
select * from websites; INSERT INTO `access_log` (`aid`, `site_id`, `count`, `date`) VALUES ('10', ...
- 软件测试day2
缺陷 定义:软件在使用过程中使用的任何问题都叫软件的缺陷,简称bug 判定标准:少功能 功能错误 多功能 隐形功能错误 不易使用 缺陷产生的原因:需求阶段 设计阶段 编码阶段 运行系统 缺陷的生命周期 ...
- Lec 09 进程
Lec 09 process 目录 Lec 09 process 回顾 分时复用有限的CPU资源 应用程序和进程 进程状态数据 处理器上下文 1 进程的表示:PCB 进程:运行中的程序 如何表示进程: ...
- 岐金兰与AI元人文概念的深度关联研究:从理论构想到实践应用
岐金兰与AI元人文概念的深度关联研究:从理论构想到实践应用 一.引言:跨学科视野下的岐金兰与AI元人文 在人工智能技术迅猛发展的2025年,岐金兰作为一位融合诗歌创作与人工智能人文研究的跨学科创作者, ...