0
点赞
收藏
分享

微信扫一扫

Leetcode0125. 验证回文串(simple,两种解法)

目录

1. 题目描述

2. 方法1

3. 方法2


1. 题目描述

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

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

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串

示例 2:

输入: "race a car"
输出: false
解释:"raceacar" 不是回文串

提示:

  • 1 <= s.length <= 2 * 10^5
  • 字符串 s 由 ASCII 字符组成

2. 方法1

        首先遍历去掉非字母和数字字符,然后统一变成小写(或者大写),再判断是否对称。

        非字母和数字字符在python中可以用str.isalnum()进行判断,

        用str.lower()或者str.upper()可以将字符串中的字符统一变成大写或者小写。

        判断是否对称则可以用用s==s[::-1]的简捷方法处理。

        

        代码如下:

class Solution:
    def isPalindrome(self, s: str) -> bool:
        s1 = ''
        for c in s:
            if c.isalnum():
                s1 = s1 + c
        s1 = s1.lower()
        return s1 == s1[::-1]
    
if __name__ == '__main__':
    
    sln = Solution()
    
    print(sln.isPalindrome("A man, a plan, a canal: Panama"))
    
    print(sln.isPalindrome("race a car"))
    
    print(sln.isPalindrome(""))

3. 方法2

        方法1利用Python的强大的内置函数,如果没有这些工具可用呢。

        可以考虑用双指针法,分别从首尾两端向中间迎头前进,逐个判断每对字符是否相等(忽略大小写的差异),碰到非数字和字母字符就跳过。

        代码如下:

class Solution:

    def isPalindrome(self, s: str) -> bool:
        lptr = 0
        rptr = len(s) - 1
        
        while lptr < rptr:
            if s[lptr].isalnum():
                while rptr >= lptr:
                    if s[rptr].isalnum():
                        if s[lptr].lower() != s[rptr].lower():
                            return False
                        rptr -= 1
                        break
                    rptr -= 1
            lptr += 1
        return True

        在Python中,方法2比运行时间比方法1要慢30%,毕竟内置函数才是最优的。所以用Python实现还是应该用第一种方法。其它没有方便的字符串处理的语言的话可以用方法2。

        但是方法2的内存消耗较小。 

        

       回到主目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)

 

举报

相关推荐

0 条评论