題目描述:給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。
解題步驟:解決此類問題可以採用動態規劃dp[i][j]表示從第i個字元到第j個字元之間的最長回文子串。該問題類似於01揹包問題
1、 狀態定義:dp[i][j] 表示從第i個字元到第j個字元之間的最長回文子串的長度
2、 狀態轉移方程:
如果第i個字元和第j個字元相同,則等於第i+1到j-1字元之間的最長子串加上2
dp [i][j] = dp [i + 1][j - 1] + 2 (s[i]==s[j])
如果第i個字元和第j個字元不同,則需要計算i和j之間子串的最大值,也即是分別i向右移動或j向左移動
dp [i][j] = max(dp[i + 1][j], dp[i][j - 1]) (s[i]!=s[j])
由於在計算dp[i][j]的時候需要提前知道dp[i+1][j]所以i從字串最後往前遍歷,dp[i][j-1]需要知道[j-1]所以j需要從前往後遍歷,並且為了使計算不重複,j需要從i+1開始。
3、 初始化:dp[i][i] = 1 單個字元的最長回文序列是 1,只需要在第乙個for迴圈即i對應的for迴圈中賦值就行了
4、 輸出:dp[0][s.length-1]
**:
public int longestpalindromesubseq(string s)
}} return dp[0][s.length()-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 個字元組成的子串中,最長的回文序...