题目如下:

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

示例 2:

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

提示:

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

题解如下

方法一:动态规划

image-20230321164819370

代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len < 2){
return s;
}
// dp[i][j] 表示 s[i..j] 是否是回文串
boolean [][]dp = new boolean[len][len];
//所有的一个字符的子串都是回文串
for(int i = 0; i < len; i++){
dp[i][i] = true;
}
char[] charArray = s.toCharArray();
//记录回文子串的初始位置
int begin = 0;
//记录回文子串长度
int childLen = 1;
for(int l = 2; l <= len;l++){
for(int i = 0;i < len;i++){
//j代表子串的尾字符的index,即确定右边界
int j = l + i - 1;
//如果尾字符超出字符串最大长度、跳出循环
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];
}
}
//若 dp[i][l] == true 成立,就表示s[i....l]是回文,记录此时回文的长度以及起始位置
if(dp[i][j] && j - i + 1 > childLen){
childLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin,begin + childLen);
}
}