給你一個字符串?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) {}
}