LeetCode 1216. Valid Palindrome III
原题链接在这里:https://leetcode.com/problems/valid-palindrome-iii/
题目:
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
题解:
Find the longest palindrome from s.
And check the difference between s and longest palindrome length, if it is <= k, then return true.
Time Complexity: O(n^2). n = s.length().
Space: O(n^2).
AC Java:
1 class Solution { 2 public boolean isValidPalindrome(String s, int k) { 3 if(s == null || s.length() <= k){ 4 return true; 5 } 6 7 int lp = findLongestPalin(s); 8 return s.length() - lp <= k; 9 } 10 11 private int findLongestPalin(String s){ 12 if(s == null || s.length() == 0){ 13 return 0; 14 } 15 16 int n = s.length(); 17 int [][] dp = new int[n][n]; 18 for(int i = n-1; i>=0; i--){ 19 dp[i][i] = 1; 20 for(int j = i+1; j<n; j++){ 21 if(s.charAt(i) == s.charAt(j)){ 22 dp[i][j] = dp[i+1][j-1] + 2; 23 }else{ 24 dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]); 25 } 26 } 27 } 28 29 return dp[0][n-1]; 30 } 31 }
AC Python:
1 class Solution: 2 def isValidPalindrome(self, s: str, k: int) -> bool: 3 if not s: 4 return True 5 6 longestPalinLen = self.findLongestPalin(s) 7 return len(s) - longestPalinLen <= k 8 9 def findLongestPalin(self, s): 10 if not s: 11 return 0 12 13 n = len(s) 14 dp = [[0 for _ in range(n)] for _ in range(n)] 15 for i in range(n - 1, -1, -1): 16 dp[i][i] = 1 17 for j in range(i + 1, n): 18 if s[i] == s[j]: 19 dp[i][j] = dp[i + 1][j - 1] + 2 20 else: 21 dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) 22 return dp[0][n - 1]
类似Longest Palindromic Subsequence, Valid Palindrome, Valid Palindrome II.