##### Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/1216.html

# 1216. Valid Palindrome III

Hard

## Description

Given a string s and an integer k, find out if the given string is a K-Palindrome or not.

A string is K-Palindrome if it can be transformed into a palindrome by removing at most k characters from it.

Example 1:

Input: s = “abcdeca”, k = 2

Output: true

Explanation: Remove ‘b’ and ‘e’ characters.

Constraints:

• 1 <= s.length <= 1000
• s has only lowercase English letters.
• 1 <= k <= s.length

## Solution

This problem can be solved by first obtaining the length of the longest palindromic subsequence, and check whether the difference between the string’s length and the length of the longest palindromic subsequence is less than or equal to k.

To obtain the length of the longest palindromic subsequence, use the solution to problem 516.

• class Solution {
public boolean isValidPalindrome(String s, int k) {
int length = s.length();
int[][] dp = new int[length][length];
for (int i = length - 1; i >= 0; i--) {
dp[i][i] = 1;
for (int j = i + 1; j < length; j++) {
if (s.charAt(i) == s.charAt(j))
dp[i][j] = dp[i + 1][j - 1] + 2;
else
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
int maxLength = dp[length - 1];
return length - maxLength <= k;
}
}

• // OJ: https://leetcode.com/problems/valid-palindrome-iii/
// Time: O(N^2)
// Space: O(N)
class Solution {
public:
bool isValidPalindrome(string s, int k) {
string t(s.rbegin(), s.rend());
int N = s.size();
vector<int> dp(N + 1);
for (int i = 0; i < N; ++i) {
int prev = 0;
for (int j = 0; j < N; ++j) {
int cur = dp[j + 1];
if (s[i] == t[j]) dp[j + 1] = 1 + prev;
else dp[j + 1] = max(dp[j + 1], dp[j]);
prev = cur;
}
}
return dp[N] + k >= s.size();
}
};

• class Solution:
def isValidPalindrome(self, s: str, k: int) -> bool:
n = len(s)
f = [ * n for _ in range(n)]
for i in range(n):
f[i][i] = 1
for i in range(n - 2, -1, -1):
for j in range(i + 1, n):
if s[i] == s[j]:
f[i][j] = f[i + 1][j - 1] + 2
else:
f[i][j] = max(f[i + 1][j], f[i][j - 1])
if f[i][j] + k >= n:
return True
return False


• func isValidPalindrome(s string, k int) bool {
n := len(s)
f := make([][]int, n)
for i := range f {
f[i] = make([]int, n)
f[i][i] = 1
}
for i := n - 2; i >= 0; i-- {
for j := i + 1; j < n; j++ {
if s[i] == s[j] {
f[i][j] = f[i+1][j-1] + 2
} else {
f[i][j] = max(f[i+1][j], f[i][j-1])
}
if f[i][j]+k >= n {
return true
}
}
}
return false
}

func max(a, b int) int {
if a > b {
return a
}
return b
}