leetcode-第10周双周赛-5099验证回文字符串③
题目描述:
方法:动态规划
class Solution: def isValidPalindrome(self, s: str, k: int) -> bool: def isKPalRec(str1, str2, m, n): dp = [[0] * (n + 1) for _ in range(m + 1)] # Fill dp[][] in bottom up manner for i in range(m + 1): for j in range(n + 1): if not i : dp[i][j] = j elif not j : dp[i][j] = i elif (str1[i - 1] == str2[j - 1]): dp[i][j] = dp[i - 1][j - 1] else: dp[i][j] = 1 + min(dp[i - 1][j], # Remove from str1 (dp[i][j - 1])) # Remove from str2 return dp[m][n] revStr = s[::-1] l = len(s) return (isKPalRec(s, revStr, l, l) <= k * 2)
自底向上:
from functools import lru_cache class Solution: def isValidPalindrome(self, s: str, k: int) -> bool: n = len(s) t = s[::-1] @lru_cache(None) def dp(i, j): if i == 0 or j == 0: return i + j i-=1;j-=1 if s[i] == t[j]: return dp(i, j) return 1 + min(dp(i+1,j), dp(i,j+1)) return dp(n, n) <= 2 * k