leetcode 5 最長回文子串(Java版)

2021-09-11 03:12:31 字數 1779 閱讀 8588

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。

示例 1:

輸入:「babad」

輸出:「bab」

注意:「aba」 也是乙個有效答案。

示例 2:

輸入:「cbbd」

輸出:「bb」

時間複雜度為o(n

2)

o(n^2)

o(n2

),空間複雜度為o(1

)o(1)

o(1)

class

solution

return

true;}

public string longestpalindrome

(string s)

int l =

1, j =

0, ll =1;

for(

int i =

1; i < s.

length()

;++i)

--ll;}}

if(ll > l)

}return s.

substring

(j-l+

1, j+1)

;//返回從j-l+1到j長度為l的子串

}}

這是一道老題目了,本來想自己想出乙個o(n

)o(n)

o(n)

的解法出來。想了半天,很興奮的覺得想到了乙個o(n

)o(n)

o(n)

的解法,結果拿去一執行,輸出不正確,最後發現是因為自己的想法在細節上存在漏洞。其實整體的思路還是沒問題的,上面的**就是按原來的想法改的,修補了細節,不過時間複雜度變為了o(n

2)

o(n^2)

o(n2)。

下面描述一下上面**的思路:

假設輸入的字串為 s ,首先我借助兩個變數來儲存最長回文字串的資訊,分別為 l 和 j。其中 l 表示最長回文子串的長度,j 表示最長回文子串的尾字元在 s 中的下標。這樣最後演算法結束後,便可通過 l 和 j 定位到最長回文子串,並返回演算法結果。另外還使用變數 ll 表示以當前字元為邊界的最長回文子串的長度。

演算法的具體流程如下:

如果當前遍歷到 s 的第 i(從0開始)個字元(此時的 l 和 j 儲存的是 s[0…i-1]的最長回文子串的資訊),通過第 i-1 個字元的 ll 來判斷當前字元有沒有增加前乙個最長回文子串的長度,如果增加了,則 ll 自增 2,此時更新後的 ll 代表的就是以第 i 個字元為邊界的最長回文子串的長度。如果沒有增加,就需要重新確定以第 i 個字元為邊界的最長回文子串的長度,確認範圍為從 ll+1 到 1。

ll 更新後,比較 ll 與 l 的大小,如果 ll 變得比 l 要大,則將當前 ll 的值賦給 l,i 的值賦給 j。

上述流程的核心是,一定要在遍歷的時候保證 ll 表示的一定是以當前字元為尾的最長回文子串的長度,這一點即本演算法的迴圈不變式。遵循該迴圈不變式,遍歷一遍 s 後即可得到結果。

最後提一下,最長回文子串問題是有 o(n) 時間複雜度的演算法的,演算法名字叫 manacher 演算法,又叫 「馬拉車」演算法,感興趣的同學可以去搜尋了解一下。

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...