给你一个字符串 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) {}
}