Leetcode 字串 5 最長回文子串

2021-10-10 12:31:38 字數 1613 閱讀 9142

給定乙個字串 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題,不難,但是會有一些小坑。本題只是要求輸出最長回文串的長度,並沒有要求輸出最長字串,我在第...