📌  相关文章
📜  删除给定数量的字符后,检查字符串仍然回文(1)

📅  最后修改于: 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算法;对于比较常规的问题,可以使用双指针。在实际应用时,根据具体情况选择合适的算法。