- 最长回文子串
来源:https://leetcode-cn.com/problems/longest-palindromic-substring/
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
class Solution {
public String longestPalindrome(String s) {
if (s == null||s.length()==0) {
return "";
}
if (s.length() < 2) {
return s;
}
// 保存起始位置,测试了用数组似乎能比全局变量稍快一点
char[] arr = s.toCharArray();
int[] ret = new int[2];
for (int i = 0; i < arr.length; i++) {
// 把回文看成中间的部分全是同一字符,左右部分相对称
// 找到下一个与当前字符不同的字符
i = longestPalindrome(arr, i, ret);
}
return s.substring(ret[0], ret[1]);
}
private static int longestPalindrome(char[] arr, int low, int[] ret) {
// 查找中间部分
int high = low;
while (high < arr.length - 1 && arr[high + 1] == arr[low]) {
high++;
}
// 定位中间部分的最后一个字符
int res = high;
// 从中间向左右扩散
while (low >= 0 && high < arr.length && arr[low] == arr[high]) {
low--;
high++;
}
// 记录最大长度
if (high - low - 1 > ret[1] - ret[0]) {
ret[1] = high;
ret[0] = low + 1;
}
return res;
}
}