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

leetcode热题100.最长回文子串(动态规划解法)

题目

5. 最长回文子串 - 力扣(LeetCode)

给你一个字符串 s,找到 s 中最长的 回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

思路

对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是 “a”。

根据这样的思路,我们就可以用动态规划的方法解决本题。我们用 P(i,j) 表示字符串 s 的第 i 到 j 个字母组成的串(下文表示成 s[i:j])是否为回文串

  • 当 p(i,j)为true时候,说明s[i,j]为回文串
  • 当p(i,j)为false时,说明s[i,j]不为回文串

我们可以得到动态转移方程: P(i,j)=P(i+1,j−1)∧(Si​==Sj​)

上文的所有讨论是建立在子串长度大于 2 的前提之上的,我们还需要考虑动态规划中的边界条件,即子串的长度为 1 或 2。对于长度为 1 的子串,它显然是个回文串;对于长度为 2 的子串,只要它的两个字母相同,它就是一个回文串。

根据这个思路,我们就可以完成动态规划了,最终的答案即为所有 P(i,j)=true 中 j−i+1(即子串长度)的最大值

代码

class Solution {public String longestPalindrome(String s) {int len = s.length();if(len<2){return s;}int maxLen = 1;int begin = 0;boolean[][] dp = new boolean[len][len];for(int i=0;i<len;i++){dp[i][i] = true;}char[] charArray = s.toCharArray();for(int L=2;L<=len;L++){for(int i=0;i<len;i++){int j = L-1+i;if(j>=len){break;}if(charArray[i] != charArray[j]){dp[i][j] = false;}else{if(j-i < 3){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;begin = i;}}}return s.substring(begin,begin+maxLen);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 算法打卡:第十一章 图论part05
  • 基于jsonpath的JSON数据查找
  • linux安装nginx+前端部署vue项目(实际测试react项目也可以)
  • vue-入门速通
  • Java基础知识扫盲
  • 【ppt2svg svg2png/jpg】ppt转图片解决方案
  • [Linux]用户管理指令
  • openai最新o1上线(2024年09月12日)
  • 研1日记15
  • PHPStorm如何调整字体大小
  • 网络信息传输安全
  • 1.《DevOps》系列K8S部署CICD流水线之部署K8S集群~version1.28.2
  • Qt_事件的介绍
  • C语言中的typedef简介
  • 达梦-华为鲲鹏ARM架构下性能测试最佳实践
  • Angular 响应式表单 基础例子
  • canvas 五子棋游戏
  • JavaScript 基本功--面试宝典
  • linux安装openssl、swoole等扩展的具体步骤
  • Swift 中的尾递归和蹦床
  • Vim 折腾记
  • Yii源码解读-服务定位器(Service Locator)
  • 聚簇索引和非聚簇索引
  • 老板让我十分钟上手nx-admin
  • 理解在java “”i=i++;”所发生的事情
  • 驱动程序原理
  • 以太坊客户端Geth命令参数详解
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • #NOIP 2014# day.2 T2 寻找道路
  • #在 README.md 中生成项目目录结构
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (Charles)如何抓取手机http的报文
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (SpringBoot)第二章:Spring创建和使用
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)程序员疫苗:代码注入
  • (转)甲方乙方——赵民谈找工作
  • .gitignore文件忽略的内容不生效问题解决
  • .net framework 4.8 开发windows系统服务
  • .net 程序发生了一个不可捕获的异常
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 的字符串暂存池
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [14]内置对象
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [C/C++] C/C++中数字与字符串之间的转换