最長回文子串 動態規劃

2021-10-16 17:03:15 字數 1356 閱讀 8168

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

示例 1:

輸入: "babad"

輸出: "bab"

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

示例 2:

輸入: "cbbd"

輸出: "bb"

暴力求解

把每個長度大於二的子串都進行驗證,然後取最大,時間複雜度o(n3),然後就愉快的超時0.0

class solution 

return true;

}string longestpalindrome(string s) }}

return str;

}};

動態規劃

動態規劃關鍵步驟狀態轉移:

乙個回文去掉兩頭以後,剩下的部分依然是回文;

如果乙個字串的頭尾兩個字元都不相等,那麼這個字串一定不是回文串;

如果乙個字串的頭尾兩個字元相等,才有必要繼續判斷下去。

如果裡面的子串是回文,整體就是回文串;

如果裡面的子串不是回文串,整體就不是回文串。

定義dp[i][j]表示s[i....j]是否為回文串(左閉右閉),根據「如果裡面的子串判斷是否回文」,可以得到轉移方程:dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1] == true

然後考慮一下邊界問題:

s[i + 1......j - 1],成立的條件為長度小於2,即j - 1 - (i + 1) < 2,即j - i < 3.

j - i < 3 等價於 j - i + 1 < 4,即當子串 s[i..j] 的長度等於 2 或者等於 3 的時候,其實只需要判斷一下頭尾兩個字元是否相等就可以直接下結論了。

如果子串 s[i + 1..j - 1] 只有 1 個字元,即去掉兩頭,剩下中間部分只有 1 個字元,顯然是回文;

如果子串 s[i + 1..j - 1] 為空串,那麼子串 s[i, j] 一定是回文子串。

因此,在 s[i] == s[j] 成立和 j - i < 3 的前提下,直接可以下結論,dp[i][j] = true,否則才執行狀態轉移。

class solution 

for (int j = 1; j < len; j++)

else

else

}if (dp[i][j] && j - i + 1 > max) }}

string str = "";

for (int i = begin; i < begin + max; i++)

return str;

}};

思路參考:liweiwei1419

動態規劃 最長回文子串

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

動態規劃 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 本題有很多種解法,最簡單的暴力求解,但是會超時。下面分別說明動態規劃法和中心擴散法。解法一 動態規劃法...

最長回文子串 動態規劃

給出乙個字串s,求s的最長回文子串的長度。樣例輸入 patzjujztaccbcc 輸出 9 尋找二維動態規劃表示式dp i j 如果直接用dp i j 表示子符串從s i 到s j 的最長回文子串長度無法得出遞推表示式。令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不...