给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
class Solution {
public String longestPalindrome(String s) {
int left = 0;
int right = 0;
char[] ss = s.toCharArray();
/**
*isPalindromic[i][j]表示 s第 i个至第 j个字母组成的子串是否为回文
* j>=i,只使用 isPalindromic的右上三角
*isPalindromic[i][i] = true
*isPalindromic[i-1][i] = true (s[i-1] == s[i])
*isPalindromic[i][j] = true (j-i>1 && isPalindromic[i+1][j-1] && s[i]==s[j])
*/
boolean[][] isPalindromic = new boolean[ss.length][ss.length];
//按列检查 isPalindromic
//isPalindromic[i+1][j-1]为 isPalindromic[i][j]的左下角元素
for(int j = 0; j < ss.length; j++) {
//isPalindromic[i][i]
isPalindromic[j][j] = true;
//isPalindromic[i-1][i]
if(0 != j) {
isPalindromic[j-1][j] = ss[j-1] == ss[j];
//判断以获取最长回文子串的长度
if(isPalindromic[j-1][j] && 1 > right - left) {
left = j - 1;
right = j;
}
}
//isPalindromic[i][j]
if(j > 1)
for(int i = 0; i <= j - 2; i++) {
isPalindromic[i][j] = isPalindromic[i+1][j-1] && (ss[i] == ss[j]);
//判断以获取最长回文子串的长度
if(isPalindromic[i][j] && j - i > right - left) {
left = i;
right = j;
}
}
}
if(right == ss.length - 1)
return s.substring(left);
else
return s.substring(left, right+1);
}
}