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 <= 1000shas 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;
}
};
I have learned LCS dp, but don't know apply this to solve this problem until read your solution.
ReplyDeletethanks you creative solution!!!
You are welcome!
Delete