LeetCode | 125.验证回文串

在这里插入图片描述
这道题一开始的想法是把原字符串的非数字英文字符去掉,然后判断剩下的字符串是否为回文串即可,其中去掉非数字英文字符可以遍历一遍字符串依次处理,也可以用正则表达式,然后判断是否是回文串只需要两个指针,一头一尾,只要不相等就返回false,相等就两个指针靠近,直到两个指针重合或者相邻且所指字符相等即可

import re
class Solution(object):
    def isPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        ss = self.remove_non_alphanumeric(s)
        if len(ss) == 0:
            return True
        i, j = 0, len(ss) - 1
        while i <= j:
            if ss[i].lower() == ss[j].lower():
                i += 1
                j -= 1
                if i == j:
                    return True
                if i == j-1 and ss[i].lower() == ss[j].lower():
                    return True
            else:
                return False
        return True
    def remove_non_alphanumeric(self, s):
        # 使用正则表达式匹配非字母数字字符,并将其替换为空字符串
        return re.sub(r'[^a-zA-Z0-9]', '', s)

class Solution:
    def isPalindrome(self, s: str) -> bool:
        sgood = "".join(ch.lower() for ch in s if ch.isalnum())
        n = len(sgood)
        left, right = 0, n - 1
        
        while left < right:
            if sgood[left] != sgood[right]:
                return False
            left, right = left + 1, right - 1
        return True

在这里插入图片描述
但是这里还可以再继续优化空间复杂度,我们可以得到空间复杂度为 O ( 1 ) O(1) O(1)的算法,直接在原字符串 s 上使用双指针。在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同。

class Solution:
    def isPalindrome(self, s: str) -> bool:
        n = len(s)
        left, right = 0, n - 1
        
        while left < right:
            while left < right and not s[left].isalnum():
                left += 1
            while left < right and not s[right].isalnum():
                right -= 1
            if left < right:
                if s[left].lower() != s[right].lower():
                    return False
                left, right = left + 1, right - 1

        return True
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ErizJ

觉得好的话给小弟一点鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值