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

 

posted @ 2019-10-07 14:58  oldby  阅读(107)  评论(0编辑  收藏  举报