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];
}
};
相關文章
- java 最長迴文子串Java
- 程式碼隨想錄day46 || 647 迴文子串, 516 最長迴文子序列
- 線性dp:LeetCode516 .最長迴文子序列LeetCode
- lc1771 由子序列構造的最長迴文串的長度
- 最長公共子序列,遞迴簡單程式碼遞迴
- 程式碼隨想錄演算法訓練營 | 647. 迴文子串,516.最長迴文子序列演算法
- 最長公共子序列
- 最長上升子序列
- 演算法-兩最長迴文子串演算法
- LEECODE 5 求最長迴文子串
- 今日面試題:最長迴文子串;及迴文分割分析面試題
- [動態規劃] 六、最長迴文子串動態規劃
- LeetCode 5.最長迴文子串LeetCode
- 演算法之字串——最長迴文子串演算法字串
- Amazon面試題:尋找最長迴文子串面試題
- 最長公共子序列(JAVA)Java
- 程式碼隨想錄演算法訓練營day46| 647. 迴文子串 516.最長迴文子序列演算法
- 動態規劃解最長迴文子序列並優化空間複雜度動態規劃優化複雜度
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- Leetcode[字串] 5. 最長迴文子串LeetCode字串
- LeetCode-5. 最長迴文子串(Manacher)LeetCode
- 翻譯數字串;及最長迴文子串分析字串
- 最長公共子序列&迴文字串 nyoj動態規劃字串動態規劃
- 程式碼隨想錄演算法訓練營第五十七/天 | 516. 最長迴文子序列,647. 迴文子串演算法
- 最長迴文子串 V2(Manacher演算法)演算法
- java 實現 最長公共子序列Java
- 最長公共子序列求方案數
- 線性dp:最長上升子序列
- 線性dp:最長公共子序列
- 每日一道 LeetCode (48):最長迴文子串LeetCode
- [LeetCode] Longest Palindromic Substring 最長迴文子串LeetCode
- ural 1297 最長迴文子串 字尾陣列陣列
- 動態規劃:最長上升子序列動態規劃
- 最長上升子序列動態規劃動態規劃
- 動態規劃-最長公共子序列動態規劃
- 動態規劃——最長公共子序列動態規劃
- 最長等差數列;及子序列分析
- 演算法題:最長公共子序列演算法