LeetCode516. 最長迴文子序列
經典動態規劃問題。用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 {
public:
int longestPalindromeSubseq(string s) {
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
for(int i = 0; i < n; ++i) {
dp[i][i] = 1;
}
for(int len = 2; len <= n; ++len) {
for(int i = 0; i + len - 1 < n; ++i) {
int j = i + len - 1;
if(s[i] == s[j]) {
dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
return dp[0][n - 1];
}
};
相關文章
- 最長迴文子序列(不連續) 可輸出迴文序列
- 線性dp:LeetCode516 .最長迴文子序列LeetCode
- 程式碼隨想錄day46 || 647 迴文子串, 516 最長迴文子序列
- java 最長迴文子串Java
- 5. 最長迴文子串
- lc1771 由子序列構造的最長迴文串的長度
- 程式碼隨想錄演算法訓練營 | 647. 迴文子串,516.最長迴文子序列演算法
- 最長迴文子串 -- 三種解答
- LeetCode 5.最長迴文子串LeetCode
- 最長公共子序列
- 最長上升子序列
- Leetcode[字串] 5. 最長迴文子串LeetCode字串
- 每日一算--最長迴文子串
- 演算法-兩最長迴文子串演算法
- LeetCode-5. 最長迴文子串(Manacher)LeetCode
- 程式碼隨想錄演算法訓練營day46| 647. 迴文子串 516.最長迴文子序列演算法
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- 最長公共子序列(JAVA)Java
- LeetCode題集-5 - 最長迴文子串(一)LeetCode
- [動態規劃] 六、最長迴文子串動態規劃
- 演算法之字串——最長迴文子串演算法字串
- 最長迴文子串你學會了嗎?
- 程式碼隨想錄演算法訓練營第五十七/天 | 516. 最長迴文子序列,647. 迴文子串演算法
- 淺談最長迴文子串求法——字串雜湊字串
- 每日一道 LeetCode (48):最長迴文子串LeetCode
- Leetcode5: Longest Palindromic Substring(最長迴文子串)LeetCode
- Amazon面試題:尋找最長迴文子串面試題
- 線性dp:最長上升子序列
- 線性dp:最長公共子序列
- 最長公共子序列求方案數
- 594. 最長和諧子序列
- java 實現 最長公共子序列Java
- 死嗑 最長上升子序列(LIS)
- 最長公共子序列 Longest Common Subsequence
- LeetCode 1143.最長公共子序列LeetCode
- 1203- 最長迴文串
- leedcode-最長迴文串
- LeetCode - 409 - 最長迴文串LeetCode