返回

从 LeetCode 680 题学回文字符串的精髓:破解回文谜团

前端

引子

算法世界的道路上,字符串处理是一块不可忽视的基石。它在现实世界中有着广泛的应用,从自然语言处理到密码学,无处不在。LeetCode 680 题——验证回文字符串 II,便是一个检验字符串处理功力的绝佳试金石。

本篇博文将带您深入探究 LeetCode 680 题,从基础概念到高级技巧,为您揭开回文字符串的奥秘,助您在算法练习中更上一层楼。

回文字符串:定义与性质

回文字符串,顾名思义,就是正读和倒读都相同的字符串。例如,"racecar"、"madam" 和 "1221" 都是回文字符串。

回文字符串具有以下几个重要的性质:

  • 长度为奇数时,中心字符唯一。
  • 长度为偶数时,中心两个字符相同。
  • 回文字符串的子字符串也是回文字符串。

这些性质在 LeetCode 680 题的求解过程中至关重要。

LeetCode 680 题:验证回文字符串 II

LeetCode 680 题要求我们验证给定的字符串是否可以被修改一次(添加或删除一个字符)成为回文字符串。

解题思路

解题思路的关键在于利用回文字符串的性质:

  1. 如果字符串的长度为奇数,则可以修改一个非中心字符。
  2. 如果字符串的长度为偶数,则可以修改一个非中心字符或删除一个中心字符。

根据以上思路,我们可以写出如下 Python 代码:

def valid_palindrome(s):
    """
    :type s: str
    :rtype: bool
    """
    # 特殊情况:空字符串或长度为 1 的字符串
    if not s or len(s) == 1:
        return True

    # 记录是否修改过
    modified = False

    # 从字符串的两端向中间遍历
    left, right = 0, len(s) - 1
    while left < right:
        # 如果两个字符相同,继续向中间遍历
        if s[left] == s[right]:
            left += 1
            right -= 1
        # 如果两个字符不同
        else:
            # 如果未修改过,尝试修改一个非中心字符
            if not modified:
                # 尝试修改左边的字符
                if s[left + 1] == s[right]:
                    left += 1
                    modified = True
                # 尝试修改右边的字符
                elif s[left] == s[right - 1]:
                    right -= 1
                    modified = True
                # 否则,字符串无法修改为回文字符串
                else:
                    return False
            # 如果已经修改过,则字符串无法修改为回文字符串
            else:
                return False

    # 遍历完成后,字符串仍然是回文字符串
    return True

结语

LeetCode 680 题是算法练习中一道经典的回文字符串处理题目。通过对回文字符串性质的深入理解,我们能够巧妙地解决问题,提升算法能力。希望这篇博文能帮助您解锁回文谜团,在算法的海洋中乘风破浪。