給定乙個字串s
,找到s
中最長的回文子串。你可以假設s
的最大長度為 1000。
示例 1:
輸入:「babad」示例 2:輸出:「bab」
注意:「aba」 也是乙個有效答案。
輸入:「cbbd」時間複雜度為o(n輸出:「bb」
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...