leetcode python3 简单题125. Valid Palindrome

1.编辑器

我使用的是win10+vscode+leetcode+python3
环境配置参见我的博客:
链接

2.第一百二十五题

(1)题目
英文:
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.

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome

(2)解法
① 使用正则化
第一种:(耗时:48ms,内存:14.9M)

class Solution:
    def isPalindrome(self, s: str) -> bool:
        p=''.join(re.findall(r'[\w\d]+',s))
        p=p.lower()
        return True if p==p[::-1] else False

注意:
1.r’[]'这个是正则化的格式,并且有:
*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、、汉字
\W 匹配特殊字符,即非字母、非数字、非汉字、非

2.\d其实是可以不要的。

第二种:(耗时:40ms,内存:14.8M)

class Solution:
    def isPalindrome(self, s: str) -> bool:
        p=''.join(re.findall(r'[a-zA-Z0-9]+',s))
        p=p.lower()
        return True if p==p[::-1] else False

② 先列举出所有的可能,再从头尾开始匹配
(耗时:60ms,内存:13.5M)

class Solution:
    def isPalindrome(self, s: str) -> bool:
        numbers = '1234567890'
        letters ='abcdefghijklmnopqrstuvwxyz'
        s = s.lower()
        s_new = ''
        for x in s:
            if (x in numbers) or (x in letters):
                s_new += x
        result = True
        half = (len(s_new)-1) // 2
        if s_new == "":
            return True
        for i in range(0,half+1):
            if s_new[i] != s_new[len(s_new)-1-i]:
                return False
        return result

③ 双指针(i和j的追击相遇问题)
(耗时:80ms,内存:13.7M)

class Solution:
    def isPalindrome(self, s: str) -> bool:
        i, j = 0, len(s) - 1
        while i < j:
            while i < len(s) and not s[i].isalnum():
                i += 1
            while j > -1 and not s[j].isalnum():
                j -= 1
            if i > j:
                return True
            if s[i].upper() != s[j].upper():
                return False
            else:
                i += 1
                j -= 1
        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值