最长回文子串
00 min
2024-7-22
2024-7-23
type
status
date
slug
summary
tags
category
icon
password

最长回文子串

给你一个字符串 s,找到 s 中最长的 回文 子串。
示例 1:
示例 2:
提示:
  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

题解

思路与算法
对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是 “a”。
根据这样的思路,我们就可以用动态规划的方法解决本题。我们用 P(i,j) 表示字符串 s 的第 i 到 j 个字母组成的串(下文表示成 s[i:j])是否为回文串:
P(i,j)={true,false,
如果子串 Si…Sj 是回文串其它情况
这里的「其它情况」包含两种可能性:
  • s[i,j] 本身不是一个回文串;
  • i>j,此时 s[i,j] 本身不合法。
那么我们就可以写出动态规划的状态转移方程:
P(i,j)=P(i+1,j−1)∧(Si==Sj) 也就是说,只有 s[i+1:j−1] 是回文串,并且 s 的第 i 和 j 个字母相同时,s[i:j] 才会是回文串。
上文的所有讨论是建立在子串长度大于 2 的前提之上的,我们还需要考虑动态规划中的边界条件,即子串的长度为 1 或 2。对于长度为 1 的子串,它显然是个回文串;对于长度为 2 的子串,只要它的两个字母相同,它就是一个回文串。因此我们就可以写出动态规划的边界条件:
{P(i,i)=true P(i,i+1)=(Si==Si+1)
 
 
 

附录

 
上一篇
最长有效括号
下一篇
最多能完成排序的块 II