📅  最后修改于: 2023-12-03 14:50:20.844000             🧑  作者: Mango
给定一个字符串和一个数字k,删除字符串中的k个字符,判断结果是否是回文串,即正序和倒序读都一样。
对于每个字符,我们有两个选择,即删除或不删除。因此我们可以使用DFS算法枚举所有可能的删除方案,再判断是否回文即可。时间复杂度为O(2^N),其中N为字符串长度。
def validPalindrome(s: str, k: int) -> bool:
return dfs(s, 0, len(s) - 1, k)
def dfs(s, left, right, k):
if left >= right:
return True
if s[left] == s[right]:
return dfs(s, left + 1, right - 1, k)
else:
if k <= 0:
return False
else:
return dfs(s, left + 1, right, k - 1) or dfs(s, left, right - 1, k - 1)
我们可以使用双指针来判断回文串。首先,我们可以用两个指针left和right指向字符串的首尾字符,如果两个字符相同,继续向中间靠拢检查;如果两个字符不同,则要么删除左边字符,要么删除右边字符,再次判断删除一个字符后是否是回文即可。
两个指针从两端向中间移动,直至相遇,时间复杂度为O(N)。
def validPalindrome(s: str, k: int) -> bool:
left, right = 0, len(s) - 1
while left < right:
if s[left] == s[right]:
left += 1
right -= 1
else:
if k <= 0:
return False
else:
return validPalindrome(s[left:right], k - 1) or validPalindrome(s[left + 1:right + 1], k - 1)
return True
两种方案各有优劣。一般来说,对于所有可能性都要考虑到的问题,可以使用DFS算法;对于比较常规的问题,可以使用双指针。在实际应用时,根据具体情况选择合适的算法。