5. 【中等】最长回文子串

https://leetcode-cn.com/problems/longest-palindromic-substring/
给你一个字符串s,找到s中最长的回文子串。

示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。
示例 2:输入:s = "cbbd"输出:"bb"
示例 3:输入:s = "a"输出:"a"
示例 4:输入:s = "ac"输出:"a"

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

【解】

【方法1】动态规划(DP)。


P(i, j)={█(“true” &, s[i, j]“是回文串” @“false” &, s[i, j]“不是回文串,或不合法(” i>j")" )┤
若字符串s的某个子串s[i, j]是回文串,且最邻近它两端的字符均相等,即s[i-1]==s[j+1],则字符串s[i-1, j+1]也是回文串。因此,状态转移方程
{█(P(i, j)&=P(i+1, j-1)∧s[i]==s[j]@P(i, i)&=“true” @P(i, i+1)&=s[i]==s[i+1] )┤
易得边界条件:长为1的字符串本身就是其最长回文子串;长为2的字符串,要么它本身为它的最长回文子串,要么它没有任何回文子串。
实现的时候要注意,一个字符串s的长度大于2的子串s[i, j]是否为s的最长回文子串,需要凭借之前已经判定过的长度更短的字串的判定结果来做出判定。
代码:

#include <vector>class Solution {public:string longestPalindrome(const string& s) {if (s.size() < 2) return s;                            // 长度为 1 的字符串本身就是其最长回文子串const size_t n = s.size();                         // 字符串 s 的长度记为 nsize_t lmax = 1;                                   // 最大长度size_t lp_begin = 0;                                // 一个最长回文子串的起始位置vector<vector<bool>> p(n, vector<bool>(n));           // p[i][j] 表示:字符串 s[i, j] 是否为回文串for (size_t i = 0; i < n; ++i) p[i][i] = true;        // 长为 1 的全部子串都是回文串for (size_t l = 2; l <= n; ++l) {                  // 枚举长为 l = 2, 3, ..., n 的子串for (size_t i = 0, j; i < n; ++i) {              // 枚举长为 l 的子串的全部可能出现的位置j = l + i - 1;if (j >= n) break;                           // 下标越界,字符串非法if (s[i] != s[j]) p[i][j] = false;else {if (j - i < 3) p[i][j] = true;            // 正在考察的字符串 s[i, j] 长为 1 或 2,且 s[i] == s[j],它应当是回文串else p[i][j] = p[i + 1][j - 1];            // 根据之前枚举过的长度更短的字符串,判定本字符串 s[i, j] 是否为回文串}if (p[i][j] && j - i + 1 > lmax) {         // 更新最长回文子串的统计数据lmax = j - i + 1;lp_begin = i;}}}return s.substr(lp_begin, lmax);                    // 给出一个解}
};
用时:584 ms,短于26.94%的用户;内存占用:29.2 MB,少于55.93%的用户。

【方法2】从回文中心向两端扩展

枚举全部长度为1或2的子串,不断考察分别与子串两端相邻的2个字符。若添加这2个字符后,新子串仍为回文串,则继续如此添加下去,直到不能再添加为止。
代码:

#include <vector>class Solution {pair<ptrdiff_t, ptrdiff_t> ExpandFromPalindromicCenter(const string& S, ptrdiff_t L, ptrdiff_t R) {while (L >= 0 and R < S.size() and S[L] == S[R]) { --L; ++R; }return { L + 1, R - 1 };}
public:string longestPalindrome(const string& s) {ptrdiff_t L = 0, R = 0;for (ptrdiff_t i = 0; i < s.size(); ++i) {auto [L1, R1] = ExpandFromPalindromicCenter(s, i, i);           // 回文中心为一个字符的情况auto [L2, R2] = ExpandFromPalindromicCenter(s, i, i + 1);      // 回文中心为两个字符的情况if (R1 - L1 > R - L) { L = L1; R = R1; }if (R2 - L2 > R - L) { L = L2; R = R2; }}return s.substr(L, R - L + 1);}
};
用时:16 ms,优于92.08%的用户;内存占用:6.9 MB,优于95.08%的用户。

【方法3】Manacher算法

(待填坑)

【LeetCode 5-中等】最长回文子串(高清截图)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 动态规划——最长回文子串(Leetcode 5)

    题目选自Leetcode 5 最长回文子串 力扣解题代码: class Solution { public:string longestPalindrome(string s) {int len=s. ...

最新文章

  1. 国内网络安全这门行业人才会不会饱和呢?
  2. java轻功游戏,会轻功又可以飞的游戏(3d大型游戏)
  3. matlab eig 复杂度,MATLAB中的eig函数
  4. .dll文件存在但是不显示_一招巧妙解决U盘内文件明明存在,打开U盘而内容却不显示的问题...
  5. Docker的一些理解(二)
  6. window下遍历并修改文件
  7. 我被C++开发欺辱的岁月
  8. html倒计时timer,js如何使用定时器实现倒计时功能
  9. HtmlHelper让我们的效率更高
  10. 基于Spring Security的认证授权_WEB授权_Spring Security OAuth2.0认证授权---springcloud工作笔记132
  11. vmware虚拟机网络模式
  12. 【原创】VBA学习笔记(21) VBA函数,appliacation函数,工作表函数,三种同名函数对比举例(3个例子)
  13. #64-【模拟】屠城(zly#3)
  14. 虚幻引擎(UE4)场景漫游交互项目制作
  15. android usb 投电视盒子,电脑还可以管理电视盒子?这样做就可以!
  16. TCP协议--复位报文段
  17. 如何快速将手写数据录入 Excel
  18. android 文字转化为图片格式,Android 文字生成图片
  19. 完美代码(让你编出无懈可击的完美代码)
  20. MISRA C:2012 又是什么标准?

热门文章

  1. 群晖服务器操作系统,群晖RS3412xs
  2. 数据分析中的异常值处理
  3. 深入分析 Java Web 中的中文编码问题
  4. 考研人工智能要学哪些科目_计算机科学与技术考研考哪些科目 备考技巧有哪些...
  5. 本地差分隐私 随机响应_局部差分隐私的新型实现方法
  6. 白灯和黄灯哪个更保护视力?精选优质的暖黄光的护眼台灯
  7. 防WiFi万能钥匙蹭网,隐藏ssid就可以了
  8. Centos7安装libpcap+libnet+libnids
  9. 闪送,为何能从顺丰中杀出一条血路?
  10. 戴尔服务器重装系统bios设置,dell服务器bios设置方法