给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
class Solution {
public String longestPalindrome(String s) {
int length = s.length();
if(length < 2) {
return s;
}
int begin = 0; // 左边界
boolean[][] flag = new boolean[length][length];
for(int i = 0; i < length; ++i){
flag[i][i] = true;
}
int maxLen = 1;
for(int L_cur = 2; L_cur <= length; ++L_cur){ // L_cur为假设最大会问子串的长度,
for(int i = 0; i < length; ++i){ // i为暂时的左边界
int j = L_cur + i - 1; // j为暂时的右边界 L_cur = j - i + 1;
if(j >= length){
break;
}
if(s.charAt(i) != s.charAt(j)){ // 如果目前长度的子串中i和j不相等的话就开始下一个
flag[i][j] = false;
}else{
if(j - i < 3){ // aba、cbc、bab类似这种的都是回文
flag[i][j] = true;
}else{
// 如果是a..a、b...b类似这种最两端是回文的但不确定中间的是否是回文,
// 则进行一个类似递归的操作,
// tips: 因为使用的是动态规划,所以比目前长度小的子串,都是知道其是否为回文子串
flag[i][j] = flag[i + 1][j - 1];
}
}
if(flag[i][j] && j - i + 1 > maxLen){
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin, begin + maxLen);
}
}