LeetCode 5. 最长回文子串
题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
输入:s = "cbbd"
输出:"bb"
题解
public static String longestPalindrome(String s) {
if (s.length() < 2) {
return s;
}
boolean[][] d = new boolean[s.length()][s.length()];
for (int i = 0; i < s.length(); i++) {
d[i][i] = true;
}
int max = 1;
int b = 0;
char[] c = s.toCharArray();
//长度从2开始
for (int L = 2; L <= s.length(); L++) {
for (int i = 0; i < s.length(); i++) {
int j = L + i - 1;
if (j >= s.length()) {
break;
}
if (c[i] != c[j]) {
d[i][j] = false;
} else {
if (j - i < 3) {
d[i][j] = true;
} else {
d[i][j] = d[i+1][j-1];
}
}
if (d[i][j] && j - i + 1 > max) {
max = j - i + 1;
b = i;
}
}
}
return s.substring(b,b + max);
}
以第一种示例演示:
首先,所有的字符串长度为1的都是回文字符串,所以我们从长度为2开始遍历,这里我们定义右边界,可以用j-i+1=L表示,即j=L+i-1;如果右边界越界,那么就可以结束循环,然后我们开始判断是否为回文字符串,开始填表,只要d[i][j]=true,我们就可以认为它是回文字符串,那么我们就记录当前回文字符串开始位置和结束位置,然后截取字符串返回。