LeetCode5099 驗證回文字串 III

2021-09-27 20:56:33 字數 1582 閱讀 7134

給出乙個字串 s 和乙個整數 k,請你幫忙判斷這個字串是不是乙個「k 回文」。

所謂「k 回文」:如果可以通過從字串中刪去最多 k 個字元將其轉換為回文,那麼這個字串就是乙個「k 回文」。

示例:

輸入:s = "abcdeca", k = 2

輸出:true

解釋:刪除字元 「b」 和 「e」。

1 <= s.length <= 1000

s 中只含有小寫英文本母

1 <= k <= s.length

原題鏈結;

dp[i][j]代表字串 索引i, j間需要刪除幾個元素才能成為回文。

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 >= j:

return 0

if s[i] == s[j]: return dp(i+1, j-1)

return 1 + min(dp(i+1,j), dp(i,j-1))

return dp(0, n-1) <= k

如果不用lru

cach

elru_cache

lruc​a

che來用記憶體儲存中間變數,可以自己建立乙個dp list:

def getdp(s, left, right, dp): 

if left >= right:

dp[left][right] = 0

return dp[left][right]

if dp[left][right]!= -1: return dp[left][right]

if s[left] == s[right]:

dp[left][right] = getdp(s, left+1, right-1, dp)

else:

dp[left][right] = min(1+getdp(s, left+1, right, dp), 1+getdp(s, left, right-1, dp))

return dp[left][right]

class solution:

def isvalidpalindrome(self, s: str, k: int) -> bool:

if len(s) <= 1:

return true

left = 0

right = len(s) - 1

dp = [[-1]*(len(s)) for _ in range(len(s))]

res = getdp(s, left, right, dp)

return res <= k

LeetCode 驗證IP位址

ipv4 位址由十進位制數和點來表示,每個位址包含4個十進位制數,其範圍為 0 255,用 分割。比如,172.16.254.1 同時,ipv4 位址內的數不會以 0 開頭。比如,位址 172.16.254.01 是不合法的。ipv6 位址由8組16進製制的數字來表示,每組表示 16 位元。這些組數...

LeetCode 驗證回文串

題目描述 給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。示例 1 輸入 a man,a plan,a canal panama 輸出 true 示例 2 輸入 race a car 輸出 false class solut...

LeetCode 驗證回文字串

給定乙個非空字串s,最多刪除乙個字元。判斷是否能成為回文字串。示例 1 輸入 aba 輸出 true 示例 2 輸入 abca 輸出 true 解釋 你可以刪除c字元。注意 字串只包含從 a z 的小寫字母。字串的最大長度是50000。思路 雙指標 當不相等的時候 左指標跳過乙個或者右指標跳過乙個 ...