返回

36. 验证回文串:算法解读与 LeetCode 题解

前端

各位算法爱好者,大家好!今天,我们来探讨 LeetCode 第 36 题——验证回文串。让我们踏上算法探秘之旅,一探究竟!

引言

字符串是否回文,即正反读都相同,是算法中一个有趣且常见的考察点。今天,我们就来深入理解验证回文串的本质,并通过 LeetCode 题解来巩固我们的算法技能。

算法详解

回文串本质上是一个对称结构,因此我们可以采取以下步骤:

  1. 忽略大小写和非字母数字字符: 将字符串转换为小写并移除所有非字母数字字符。
  2. 双指针技巧: 使用两个指针 leftright 分别指向字符串的开头和结尾。
  3. 指针比较: 比较 left 指针和 right 指针指向的字符是否相同。如果相同,则继续前进;如果不相同,则字符串不是回文。
  4. 重复步骤 3: 直到 left 指针大于等于 right 指针。

代码实现

def isPalindrome(s):
    # 忽略大小写和非字母数字字符
    s = s.lower()
    s = ''.join(filter(str.isalnum, s))

    # 双指针技巧
    left, right = 0, len(s) - 1
    while left <= right:
        if s[left] != s[right]:
            return False
        left += 1
        right -= 1

    return True

LeetCode 题解

在 LeetCode 上,这道题的题解同样采用了双指针技巧。值得注意的是,题解中还使用了正则表达式来一次性过滤掉非字母数字字符,代码更加简洁。

完整代码:

import re

class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = s.lower()
        s = re.sub('[^a-z0-9]', '', s)
        
        left, right = 0, len(s) - 1
        while left <= right:
            if s[left] != s[right]:
                return False
            left += 1
            right -= 1
        return True

结语

验证回文串算法看似简单,但它巧妙地运用了双指针技巧,充分利用了回文的对称性。通过今天的探究,我们不仅巩固了算法基础,也为解决类似问题积累了宝贵经验。加油,算法小达人们!