給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是乙個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
我最開始感覺這道題乍一看有些懵,腦海裡能想到的演算法就是o(n
2)
o(n^2)
o(n2
)的暴力解法,還嫌演算法複雜度太高,但是事實上暴力搜尋的複雜度是要達到o(n
3)
o(n^3)
o(n3
)的,也就是說左邊界,右邊界和子串的計算移動都是與n
nn有關的。那麼苦思冥想30min後依舊沒想明白,看到了題解才發現乙個早有耳聞但是從未了解過的老朋友:動態規劃。
那麼這道題為什麼要用動態規劃來解呢?首先就是這個題的形式就很動規,它乙個回文子串的子串一定是回文子串,因此這可以用劃分子問題的思想進行解答。
在確定了動態規劃的實現方法以後,我們就有了乙個關係,即對於字串s[i
,j
]s[i,j]
s[i,j]
即從第i
ii個位置到第j
jj個位置的字串(包含頭尾),我們知道如果s[i
,j
]s[i,j]
s[i,j]
是回文子串,那麼s[i
+1,j
−1
]s[i+1,j-1]
s[i+1,
j−1]
一定也是回文子串,並且s[i
]s[i]
s[i]
要等於s[j
]s[j]
s[j]
。自此我們有了第乙個關係。
有兩個地方需要格外注意一下:
特判:當字元字串的長度為0或者為1的時候,i+1
i+1i+
1是小於j−1
j-1j−
1的,因此需要增加兩個特判,對於l=0
l=0l=
0的情況,dp必得1,對於l=1
l=1l=
1的情況,如果s[i
]==s
[j
]s[i]==s[j]
s[i]==
s[j]
,也有dp=1,否則dp=0。
邊界條件的判斷:因為我們是自底向上進行狀態的轉移的,因此外迴圈的字串長度要從小到大。而內迴圈中因為有i+l
i+li+
l這一項,我們的內迴圈終止條件就是i+l
<
ni+li+
l
class
solution
if( dp[i]
[j]==
1&& l+
1> ans.
size()
) ans = s.
substr
(i, l+1)
;}}return ans;}}
;
這道題運用了動態規劃來求解,雖然複雜度還是高了一點,但是思路無疑是我們需要掌握的,動態規劃的題有的很難,但是大套路基本就幾種,因此,想要掌握動態規劃還需要至少10道題的練習。 leetcode 最長字串
編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例 1 輸入 flower flow flight 輸出 fl 示例 2 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。說明 所有輸入只包含小寫字母 a z 用橫向遍歷 public static ...
LeetCode 最長匹配括號字串
最長括號匹配長度。如果是 是否 的話,題目是easy,一旦是找最長,那就是hard難度了。棧記錄當前的 位置 關鍵是在斷開的位置,之後可能是全新的開始 也可能是並列的開始 要記錄長度,其實這就要求棧中不是括號,而是位置資訊。棧中的記錄為 看 下方 class solution def longest...
字串 Leetcode409 最長回文串
題目 給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串。注意 假設字串的長度不會超過 1010。思路 這題是easy題,不難,但是會有一些小坑。本題只是要求輸出最長回文串的長度,並沒有要求輸出最長字串,我在第...