字符串最多删除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;
}
};