LeetCode516 最長回文子串行

2021-10-10 11:29:13 字數 991 閱讀 4713

經典動態規劃問題。用dp[i][j]表示字串s的以i開頭,以j結尾的子串的最大回文子串行的長度。我們要求的s的最長回文子串行的長度就是dp[0][n - 1]。

考慮一下陣列的初始化,對於所有的i(0 <= i < n),都有dp[i][i] = 1,表示單個字母可以組成乙個長度為1的回文子串行。

然後要進行遞推和狀態轉移,我們列舉子串的長度len從2到n,子串的起點i從0到n - len + 1。n - len + 1是為了讓當前子串的結尾不超過s的長度。

這樣我們得到當前子串的起點i,和終點j = n - len + 1。

比較s[i]與s[j]是否相等。

(1)如果相等,說明子串s[i ~ j]可以在原來的子串s[i + 1 ~ j - 1]的基礎上構成

乙個長度+2的回文子串行。因此我們得到狀態轉移方程:dp[i][j] = dp[i + 1][j - 1] + 2

(2)如果不相等,說明子串s[i ~ j]無法在原來的子串s[i + 1 ~ j - 1]的基礎上構成

乙個長度+2的回文子串行,但是s[i + 1 ~ j]和s[i ~ j - 1]仍然有可能是乙個回文子串行,我們要求的s[i ~ j]的最大回文子串行肯定是

s[i + 1 ~ j]和s[i ~ j - 1]兩者中的最大回文子串行的較大者。因此我們得到狀態轉移方程:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])

列舉完長度和子串起點之後,最後返回的dp[0][n - 1]就是答案。

**如下:

class solution 

for(int len = 2; len <= n; ++len) else }}

return dp[0][n - 1];}};

LeetCode 516 最長回文子串行

這題看了好久 本來以為和最長字串差不多用動態規劃設兩個列表來算但是沒什麼頭緒 後來去看了別人的解法 看了十幾分鐘才看懂 下面這種解法 1單位要單獨拿出來算 從2開始因為互文的子串行兩頭肯定是一樣的 如 aba acbca 假如能使 martix i j 等於從 s i 到 s j 所包含的最大子串行...

leetcode 516 最長回文子串行

給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。示例 1 輸入 bbbab 輸出 4 乙個可能的最長回文子串行為 bbbb 示例 2 輸入 cbbd 輸出 2 乙個可能的最長回文子串行為 bb 解題思路 狀態 f i j 表示 s 的第 i 個字元到第 j 個字元組成的子串...

leetcode516 最長回文子串行

給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。示例 1 輸入 bbbab 輸出 4 乙個可能的最長回文子串行為 bbbb 示例 2 輸入 cbbd 輸出 2 乙個可能的最長回文子串行為 bb f i j 表示 s 的第 i 個字元到第 j 個字元組成的子串中,最長的回文序...