1216. Valid Palindrome III

https://leetcode.com/problems/valid-palindrome-iii/

字符串最多删除K个字符能否变成回文。问题转化为N - Longest Palindrome Subsequence,dp[i][j]表示[i, j]内最长的回文子序列长度,当s[i] == s[j] 时dp[i][j]为中间[i + 1, j - 1]最长加2,否则为删去一个字符i或j后子问题的解。

class Solution {
public:
    bool isValidPalindrome(string s, int k) {
        const int N = s.length();
        vector<vector<int>> dp(N, vector<int>(N, 0));
        for (int i = 0; i < N; ++i) dp[i][i] = 1;
        for (int i = N - 1; i >= 0; --i) {
            for (int j = i + 1; j < N; ++j) {
                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 N - dp[0][N - 1] <= k; 
    }
};

Last updated