5 最長回文子串 動態規劃

2021-10-07 08:08:42 字數 1421 閱讀 2569

題目描述:

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

示例 1:

輸入: 「babad」

輸出: 「bab」

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

示例 2:

輸入: 「cbbd」

輸出: 「bb」

方法1 中心擴散

主要思路:

(1)遍歷字串的每乙個位置,以該位置作為基點,向兩端進行擴充套件,判斷回文;

(2)針對每乙個基點,需要判斷回文字串可能是偶數或者奇數的兩種情形;

(3)判斷回文字串時,終止條件是左右方向不越界,且一直滿足回文要求;

class

solution

//根據左右索引判斷當前回文字串是否長度更長

if(right-left>split.second-split.first)

//回文字串可能為偶數的情形

left=i;

right=i+1;

while

(left>=

0&&rightsize()

&&s[right]

==s[left])if

(right-left>split.second-split.first)

}//返回滿足要求的回文字串

return s.

substr

(split.first+

1,split.second-split.first-1)

;}};

方法2 動態規劃

思路:(1)對於長度大於2的回文字串,其去掉兩端的字元後,依舊是回文字串,那麼,對於驗證某個字串是否是回文字串,只要保證其減去兩端後的子字串是回文,且兩端字元相等,則該字串是回文字串,這就相當於是狀態轉移;

(2)對於字串長度為1的字串,是回文字串,對於長度為2的字串,只要這兩個字串相等,則是回文字串,這就相當於是初始狀態;

class

solution

//判斷子字串長度為2的情形

else

if(length==1)

//判別子字串長度大於2的情形

else

//判斷當前回文子串長度是否是當前最長的

if(dp[i]

[j]&&length>split.second-split.first)}}

//返回滿足要求的子串

return s.

substr

(split.first,split.second-split.first+1)

;}};

5 最長回文子串 動態規劃)

一 題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 二 題解 方法一 動態規劃 dp i j 表示從位置i到位置j的子串是否為回文串 如果s...

LeetCode 動態規劃 5 最長回文子串

原題連線 class solution int len s.length if len 1 if len 1 len 3 s.charat 0 s.charat len 1 狀態陣列定義 dp 游標位置i j ij包含的部分是否是回文字串 boolean dp newboolean len len ...

動態規劃 最長回文子串

動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...