问题描述

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

示例 1:

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

示例 2:

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

示例 3:

输入:s = "a"
输出:"a"

示例 4:

输入:s = "ac"
输出:"a"

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

解题思路

对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串{"ababa’’},如果我们已经知道{“bab”} 是回文串,那么 {"ababa’’} 一定是回文串,这是因为它的首尾两个字母都是“a”。
根据这样的思路,我们就可以用动态规划的方法解决本题。
如果一个字符串的头尾两个字符都不相等,那么这个字符串一定不是回文串;
如果一个字符串的头尾两个字符相等,才有必要继续判断下去。

  • 如果里面的子串是回文,整体就是回文串;
  • 如果里面的子串不是回文串,整体就不是回文串。

即:在头尾字符相等的情况下,里面子串的回文性质据定了整个子串的回文性质,这就是状态转移。因此可以把「状态」定义为原字符串的一个子串是否为回文子串。
第 1 步:定义状态
dp[i][j] 表示子串 s[i…j] 是否为回文子串,这里子串 s[i…j] 定义为左闭右闭区间,可以取到 s[i] 和 s[j]。

第 2 步:思考状态转移方程
在这一步分类讨论(根据头尾字符是否相等),根据上面的分析得到:

dp[i][i] = (s[i]==s[j])   abd dp[i][j]                当j-i<=1时
dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]      当j-i>1时

实现代码

class Solution {public String longestPalindrome(String s) {int n=s.length();char [] arrStr=s.toCharArray();     //将字符串转化为数组,便于运算int maxi=0,maxj=0;          //标记最长回文子串的下标int maxlen=0;//标记数组,标记从起点i到终点j之间的字符是否是回文子串,默认全为falseboolean [][] f=new boolean[n][n];      //这里i是终点,j是i之前的字符,即以i为终点,遍历i之前的字符是否为回文子串//注意这里的顺序,一定要保证后面的回文子串利用到前面的回文子串时,前面的回文子串一定被计算出来过了。for(int i=0;i<n;i++){for(int j=0;j<=i;j++){//当i-j<=1时,判读那两个字符是否相等,相等即为回文子串,这里包含了i与j重合的情况if(i-j<=1){if(arrStr[i]!=arrStr[j]){f[j][i]=false;}else{f[j][i]=true;       //相等时如果大于当前最长回文子串的时候,就记录下来if(maxlen<(i-j+1)){maxlen=i-j+1;maxi=i;maxj=j;}}}else{//当i-j>1时,需要判断当前两个字符是否相等,并且还要判断子字符串是否为回文子串。if(arrStr[i]==arrStr[j] && f[j+1][i-1]==true){f[j][i]=true;if(maxlen<(i-j+1)){maxlen=i-j+1;maxi=i;maxj=j;}}else{f[j][i]=false;}}}}String res="";for(int i=maxj;i<=maxi;i++){res+=arrStr[i];}return res;}
}

leetcode题解5-最长回文子串相关推荐

  1. java 最长回文_【Java】【每日算法/刷穿 LeetCode】5. 最长回文子串(中等)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]5. 最长回文子串(中等) 宫水三叶发布于 今天 12:00 题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 ...

  2. 【LeetCode系列】最长回文子串(双指针中心扩散)与可怜的小猪(老鼠毒药问题)

    ⭐️前面的话⭐️ 本篇文章介绍来自牛客试题广场的两道题题解,分别为[最长回文子串]和[可怜的小猪],展示语言java.

  3. 题解:最长回文子串(4种解法)

    一.描述 二.题解: 2.1 暴力法(O(N3)O(N^3)O(N3)) 解释: 循环三次.第一次起始点循环:第二次终止点循环(从最右边开始到起始点为止):第三次起始点开始终止点结束,当两个值不相等时 ...

  4. leetcode算法题--最长回文子串

    题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 相关题目:最长回文子序列 动态规划 dp[i][j]表示从i到 ...

  5. 【LeetCode】5.最长回文子串

    5.最长回文子串 一.问题描述 给你一个字符串 s,找到 s 中最长的回文子串. 二.问题简化 所谓回文字符串,即反过来念的字符串和正着念一样.比如"卿卿我我卿卿"."一 ...

  6. 刻意练习:LeetCode实战 -- Task17. 最长回文子串

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  7. LeetCode实战:最长回文子串

    题目英文 Given a string s, find the longest palindromic substring in s. You may assume that the maximum ...

  8. 力扣Leetcode:5. 最长回文子串(Python)

    题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 题解:动态规划 这是一道很经典的题目.首先我想到了动态规划算法: 对于子串s[i-j],它为回文子串的条件为:s[i+1 - j-1]为回文 ...

  9. leetcode题库5-- 最长回文子串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...

  10. LeetCode刷题——最长回文子串

    目录 一.题目描述 二.题解 三.源码 一.题目描述 二.题解 三.源码 class Solution(object):def longestPalindrome(self, s):"&qu ...

最新文章

  1. List集合add方法覆盖原来的内容解决办法
  2. webpack4.0 babel配置遇到的问题
  3. 跨部门不配合工作_跨部门协作,队友总是“甩锅”,这三个方法教你快速避坑!...
  4. java过滤html标签获取纯文本信息
  5. 国家开放大学2021春1108钢结构(本)题目
  6. nodejs实战案例(Express框架+mongoDB)——(15)——爬虫功能
  7. Intel CMT CAT CDP 技术应用
  8. 解密Cocos2D中的Lua源码
  9. SpringBoot简明教程
  10. [解决方法]shc -f xxx.sh shc: invalid first line in script
  11. 使用c++filt命令还原C++编译后的函数名
  12. 立帖为据,每日学习一课编程技术
  13. java蓝桥杯数字黑洞_蓝桥杯题目练习之数字黑洞
  14. LeetCode上的各种股票最大收益
  15. 电箱吉他与原声吉他的区别在哪里?初学者应该选哪个呢?
  16. hualinux 编程概念 3.11 快速原型模型:以最快最小代价完成产品特性
  17. MFC实现交通图导航系统
  18. 手把手转行|小步试错,逐步迭代
  19. 离线数仓-01-项目介绍和用户行为数据采集
  20. 高斯分布-sklearn.mixture.GaussianMixture()

热门文章

  1. 苹果高通关系紧张背后:不只是专利问题 还有两家公司CEO的私人恩怨
  2. 乔布斯诞辰64周年 库克发文纪念:我们每一天都怀念他
  3. 拳王公社:网络引流的“4大核心秘诀“,让客户源源不断地加你
  4. 从送快递转好到软件测试,自学三个月后,我拿到了12k?
  5. 前端、后台和连接前端后台的网络数据传输
  6. php v命令找不到,-bash: php: command not found 命令找不到
  7. python筛选csv数据_pandas数据筛选和csv操作的实现方法
  8. birt中文手册在线_QGIS简体中文翻译现状
  9. 微信python课_微信课程提醒助手———python
  10. 点阵字体显示系列补记:将字库文件转换成数组形式