Back to all solutions

#1216 - Valid Palindrome III

Problem Description

Given a string s and an integer k, return true if s is a k-palindrome.

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

Solution

/**
 * @param {string} s
 * @param {number} k
 * @return {boolean}
 */
var isValidPalindrome = function(s, k) {
  const n = s.length;
  const memo = new Array(n).fill().map(() => new Array(n).fill(-1));
  const longestPalindrome = longestPalindromeSubseq(0, n - 1);
  const deletions = n - longestPalindrome;

  return deletions <= k;

  function longestPalindromeSubseq(left, right) {
    if (left > right) return 0;
    if (left === right) return 1;

    if (memo[left][right] !== -1) return memo[left][right];

    if (s[left] === s[right]) {
      memo[left][right] = 2 + longestPalindromeSubseq(left + 1, right - 1);
    } else {
      memo[left][right] = Math.max(
        longestPalindromeSubseq(left + 1, right),
        longestPalindromeSubseq(left, right - 1)
      );
    }

    return memo[left][right];
  }
};