超详细讲解:leetcode-0125-ValidPalindrome(验证回文串)

1. 题目地址

2. 题目描述

  • 英文描述
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:
Input: "A man, a plan, a canal: Panama"
Output: true

Example 2:
Input: "race a car"
Output: false

  • 中文描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:
输入: "race a car"
输出: false

3. 解题思路

  • 这是一道最简单的考察回文串的题目,就是判断一个字符串是不是回文。
  • 解题重点:双指针
    (1)采用双指针:一个头指针,一个尾指针,分别指向字符串的头和尾。
    (2)若两个指针上的元素不相同,则直接返回False,结束判断。
    (3)若两个指针上的元素相同,则头指针向后一步,尾指针向前进一步,头尾指针同时更新,直到头尾指针相遇,返回True;或者所指的元素出现不相同的情况,返回False。
    (4)时间复杂度:O(n)
    (5)空间复杂度:O(1)
  • 注意1:题目要求是只考虑数字和字母,所以对字符串中出现的其他字符就不要做任何处理和判断了。判断是否是数字和字母,可以采用**isalnum()**方法。

以python中的用法为例:str.isalnum()
用来检测字符串是否由字母和数字组成,是就返回True,否则返回False。

例1:
str = “this2009”
print(str.isalnum())
True

例2:
str = “this is string example…wow!!!”
print(str.isalnum())
False

  • 注意2:题目要求是忽略字母大小写,所以在判断元素是否相等时,可以统计转换成大写或者小写字母,再进行判断。

以python中的用法为例:
(1)str.lower() 方法是将字符串中所有的大写字符转换为小写。
(2)str.upper() 方法是将字符串中所有的小写字符转换为大写。

4. 解题关键

  • 要想到头尾双指针的操作
    • 第1步:两个指针,一个指向头,一个指向尾。
    • 第2步:若头尾指针上的元素不相等,直接返回False,结束。
    • 第3步:若头尾指针上的元素相等,同时更新前进,直到头尾指针相遇或者出现不相等。
  • 要点
    • 只考虑数字和字母:用str.isalnum()判断。
    • 忽略字母大小写:统一成str.lower()或str.upper()再比较。
  • 复杂度
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)

5. 更pythonic的方式

  • 去掉无关字符,直接判断是否回文串
    • 第1步:将字符串中的数字和字母按顺序取出。
    • 第2步:将大写的字母转化为小写字母添加到一个新的字符串中。
    • 第3步:判断是否回文字符(s[::-1] == s)。

6. 示例代码

python

# coding:utf-8
'''
# @Method:头尾双指针
# @Author: wlhr62
import os


class Solution1:
    def isPalindrome(self, s: str) -> bool:
        left = 0
        right = len(s) - 1
        while left < right:
            if not s[left].isalnum():
                left += 1
                continue
            if not s[right].isalnum():
                right -= 1
                continue
            if s[left].lower() == s[right].lower():
                left += 1
                right -= 1
                continue
            else:
                break
        return right <= left


class Solution2:
    def isPalindrome(self, s: str) -> bool:
        s_new = ''.join(filter(str.isalnum, s)).lower()
        return s_new[::-1] == s_new


if __name__ == "__main__":
    str1 = "A man, a plan, a canal: Panama"
    str2 = "race a car"

    A = Solution1()
    # A = Solution2()
    res1 = A.isPalindrome(str1)
    print(str1 + "的判断结果:", res1)
    res2 = A.isPalindrome(str2)
    print(str2 + "的判断结果:", res2)

运行结果

A man, a plan, a canal: Panama的判断结果: True
race a car的判断结果: False

在leetcode上AC的结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201117215917732.png#pic_center

6. 相关题目

超详细讲解:leetcode-0009-PalindromeNumber(回文数)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值