歡迎訪問個人我的網站java
LeetCode:https://leetcode.com/problems/longest-palindromic-substring/git
LeetCodeCn:https://leetcode-cn.com/problems/longest-palindromic-substring/github
給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。網站
示例 1:spa
示例 2:3d
感受暴力法什麼的,能夠再也不說了code
若是一個子串是迴文,那麼它本事是一個左右對稱的形式,長度爲n的子串,其中心有2n-1個,由於長度爲偶數的子串,其中心可能在兩個文字中間.接下來咱們只要依次查找每一個子串元素和兩個元素中間做爲迴文子串的中心,記錄其中最長的子串信息.cdn
在正式開始以前,咱們先看一下如何查找一箇中心能匹配的迴文最長長度是如何獲得的.blog
前面提到,奇數長度的迴文串和偶數長度的迴文串其中心是不一樣,在查找的過程當中咱們要分別區分兩種狀況來理解.leetcode
假設其長度爲奇數,說明中心位置的元素無需和其它元素匹配(由於自己和自己必定相等),檢測其左右相同長度的元素是否相等,以下圖,假設中心位置是第1位的a,其左右元素相同,分別減小l和增長r,當時此時l = -1,並不合法,因此第1位做爲中心的最長迴文長度爲3.
假設其長度爲偶數,至關於其中心是一個空元素,也必定與自己相同,咱們直接檢測其兩側的元素是否相同,步驟同上.
咱們將"babab"做爲參數,此時start(最長子串的開始位置)默認爲0,end(最長子串的結束位置)默認爲0.
當咱們搜索第0位時,len(奇) = 1, len(偶) = 0,其最大回文子串長度爲1,大於當前start和end之間的差.咱們須要更新statr和end的內容.end須要在i的基礎上增長len/2,start須要在i的基礎上減去(len - 1) /2,(防止偶數子串引發的越界問題).
咱們繼續移動i,當i = 1時,此時其最長子串爲3,更新start值爲0,end值爲2.
後邊內容不重複, 由於每次計算相對來講都是獨立,只須要將此爲獲得的最長迴文子串長度和已知的比對便可
public String longestPalindrome(String s) {
if (s == null || s.length() < 1){
return "";
}
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len = Math.max(isCenterNum(s, i , i), isCenterNum(s , i, i+1));
if (len > end - start){
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
//計算某位中中心的最長迴文子串方法
public int isCenterNum(String s, int l, int r){
while (l >= 0 && r < s.length() && (s.charAt(l) == s.charAt(r))) {
l--;
r++;
}
return r - l - 1;
}
複製代碼
相關代碼歡迎你們關注並提出改進的建議