給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: 「babad」
輸出: 「bab」
注意: 「aba」 也是乙個有效答案。
示例 2:
輸入: 「cbbd」
輸出: 「bb」
觀察回文串的特點,其必定以某字元為中心完全對稱,如:"abba"以"bb"為中心對稱,"aba"以"b"為中心對稱,"abba"以"bb"為中心對稱,"abbba"以"bbb"為中心對稱。
故我們只需遍歷以所有字元(or 多個相連重複字元)為中心的子串(遍歷時可將多個相連重複字元視為乙個中心字元),並判定其是否為回文串,若是回文串,則將其長度與以前一字元為中心時的最大長度max_len進行比較,長度更大則更新max_len,長度更小則保留原來的max_len。用left和right記錄以s[index]為中心的回文子串的最左端和最右端,因此回文子串長度為 (right - 1) - (left + 1) + 1 = right-left-1。
演算法步驟如下:
1)從index=0開始遍歷字串,用left和right記錄以s[index]為中心的回文子串的最左端和最右端,left=index-1,right=index+1;
2)以index為起始位置向右計數所有與s[index]相等且連續的字元,若有多個相等連續字元則以多個相等字元為中心,right指向中心字串的下乙個字元,而left指向中心字串的前乙個字元。若僅以乙個字元為中心,則left和right不變。迴圈執行4);
3)定位下乙個中心index,下乙個中心為單個字元或重複字串的下乙個字元。
4)比較s[left]與s[right],若相等則left–,right++,直至兩者不相等或left與right超出索引範圍迴圈結束,更新max_len的值,並記錄該子串的開始位置start=left+1。
class
solution
//定位下乙個子串的中心
LeetCode5最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 動態規劃來做,每個回文字串的子字串也是回文字串,即string是回文字串那麼它的string.substring 1,lenth ...
LeetCode 5 最長回文子串
問題描述 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解決方案 中心擴充套件演算法 事實上,只需使用恆定的空間,我們就可以在 o n 2 的時間內解決這個問題...
leetcode5 最長回文子串
遞推式 1 一般 s i 1 s j 1 and j i and j i len s i 1,j 1 2 初始化dp矩陣對角線的值為 true,相鄰兩個元素相等時dp i i 1 為true 初始化回文串起始位置和長度。def longestpalindrome s n len s if s ret...