給出乙個字串 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
lruca
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。思路 雙指標 當不相等的時候 左指標跳過乙個或者右指標跳過乙個 ...