5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
中心扩散法:
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len < 2) return s;
int maxLen = 0;
// 数组第一位记录起始位置,第二位记录长度
int[] res = new int[2];
for (int i = 0; i < s.length() - 1; i++) {
int[] odd = centerSpread(s, i, i);
int[] even = centerSpread(s, i, i + 1);
int[] max = odd[1] > even[1] ? odd : even;
if (max[1] > maxLen) {
res = max;
maxLen = max[1];
}
}
return s.substring(res[0], res[0] + res[1]); // substring前闭后开
}
private int[] centerSpread(String s, int left, int right) {
int len = s.length();
while (left >= 0 && right < len) {
if (s.charAt(left) == s.charAt(right)) {
left--;
right++;
} else {
break;
}
}
// 这个方法刚开始的时候 left 和 right 从中间向两侧扩散,直到 left 和 right 指向的字符不相等的时候停下来。所以「回文」的开始位置是 left + 1(返回数组的第 1 个数),结束位置是 right - 1。
// 回文长度 = 结束位置 - 起始位置 + 1
return new int[]{left + 1, right - left - 1};
}
}