Saturday, October 5, 2019

Leetcode 1216: Valid Palindrome III

https://leetcode.com/problems/valid-palindrome-iii/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

Notes:

The key to this question is how to convert the question to an equivalent one.

If we have another string, t, which is just the string s in the reverse order, then this question becomes relevant to the longest common sequence.

If the length of lcs is no smaller than (len - k), it is true.

See the code below:

class Solution {
public:
    bool isValidPalindrome(string s, int k) {
        string t = s;
        reverse(t.begin(), t.end());
        int len = s.size();
        vector<vector<int>> dp(len+1, vector<int>(len+1, 0));
        for(int i=1; i<=len; ++i) {
            for(int j=1; j<=len; ++j) {
                if(s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
                else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            }
        }
        return len - dp[len][len] <= k;
    }
};

2 comments:

  1. I have learned LCS dp, but don't know apply this to solve this problem until read your solution.
    thanks you creative solution!!!

    ReplyDelete