题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
题解
中心扩展法
- 遍历字符串,选取回文串的中心
- 从中心向两边扩散,扩散至最大的回文子串,如果此时回文的长度更长,更新结果
- 需要注意的是,回文串的中心可能是一个字符如:aba,此时中心为b。 也可能是两个字符如:abba,此时中心为bb。所以一个长度为len的字符串,那么作为回文中心的可能性有
2 * len - 1
个,len
个单个字符的,len - 1
个两个字符的,需要都遍历到。详见代码注释
class Solution {
public String longestPalindrome(String s) {
char[] cs = s.toCharArray();
//reslen记录res的长度,len为字符串的长度
int resLen = 0, len = s.length();
//记录结果的起始位置
int start = 0;
//一共有2*len-1个中心
for (int i = 0; i < 2 * len - 1; i++){
//双指针初始化
//当i为偶数时,left和right指向的是同一个字符,也就是单个字符为中心
//当i为奇数时,left和right指向的是相邻的两个字符,也就是两个字符为中心
int left = i / 2;
int right = (i + 1) / 2;
//向两边扩散,记得判断边界
while (left >= 0 && right < len && cs[left] == cs[right]){
//如果当前的回文字符串比res的长度大,更新resLen,并且记录开始位置,即left
if (right - left + 1 > resLen) {
start = left;
resLen = right - left + 1;
}
left--;
right++;
}
}
//返回结果,start开始,长度为reslen的字串
return s.substring(start, start + resLen);
}
}