给你一个字符串 s
,找到 s
中最长的回文子串
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
在本题目中将采用中心扩散法,此方法非常简单使用:
1.整体遍历,让字符串每个字符都当一次中心。
2.选取中心点的左右两边作为拓展对象,先判断是否与中心点相同,如果与中心点相同,则需要继续向左边或者右边进行拓展。
3.选择好拓展两个起始点之后,开始向左右两边同时扩展,如果遇到左右两边不相同则停止扩展,如果相同则继续。
4.扩展的同时需要注意记录每趟得出的最长回文的起始以及终止下标,由于我们直接初始化了一个最大长度,每躺比较之后,都会与最大长度比较,如果比最大长度大,则取代最大长度,并记录该回文的起始下标,这样也就不需要记录结束长度(可推导)。
以下是代码实现:
package com.wxy.lanqiaobei;
public class 最长回文子串 {
public static String longestPalindrome(String s){
//实时长度
int len = 1;
//总长度
int strLen = s.length();
//左右
int left = 0,right = 0;
//由于最后是提交字符串,需要记录符合的回文字符串头下标
int maxStart = 0;
//最大长度
int maxLen = 0;
for(int i = 0;i<s.length();i++){
//表示指向中心点左右两个字符
left = i - 1;
right = i + 1;
//向左扩展,当遇到与中心点相同则扩展
while (left >= 0 && s.charAt(left) == s.charAt(i)){
left--;
len++;
}
//向左扩展,当遇到与中心点相同则扩展
while (right < strLen && s.charAt(right) == s.charAt(i)){
right ++;
len ++;
}
//左右一起扩散
while (left >= 0 && right < strLen && s.charAt(left) == s.charAt(right)){
left --;
right++;
len++;
}
if(len > maxLen){
maxLen = len;
maxStart = left;
}
len = 1;
}
return s.substring(maxStart + 1,maxStart + maxLen + 1);
}
public static void main(String[] args) {
}
}