leetcode 125. Valid Palindrome 正则 python3

本文介绍了三种解决LeetCode上判断回文字符串问题的方法:手动筛选、正则表达式和双指针法。通过实例详细解析了每种方法的实现过程,帮助读者理解并掌握回文字符串的判断技巧。

学期考试结束,重新开始刷leetcode!

一.问题描述

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.自己动手筛选

就迭代字符串里的所有字符,判断一下是否是字母或者数字,是的话加进新生成的字符串里。

最后对这个新生成的字符串判断一下是否回文串,你可以简单的把字符串反转判断是否和反转前字符串相等,也可以用指针一个个判断,这个只用迭代字符串长度的一半。

不过虽然说只用迭代一般的字符串长度,但是还是没有内置函数快。

2.正则表达式

用python提供的re库来进行正则筛选,对所有非数字和字母的字符替换成空格。之后处理同上。

[^A-Za-z0-9]+, 这是筛选的正则表达式

关于正则给一个参考:正则表达式 - 匹配规则

3.双指针

思想和前面的差不多,只不过把筛选和匹配同时进行,两个指针指向一头一尾,如果遇到非数字或者字母,就往后或者往前移动一格,如果都是数字或者字母则匹配。

更多leetcode算法题解法: 专栏 leetcode算法从零到结束  或者 leetcode 解题目录 Python3 一步一步持续更新~

三.源码

1.自己动手

class Solution:
    def isPalindrome(self, s: str) -> bool:
        new_str=""
        for ch in s:
            if ch>='0' and ch<='9' or ch>='A' and ch<='Z'or ch>='a' and ch<='z':
                new_str+=ch.lower()
        for i in range(len(new_str)//2):
            if new_str[i]!=new_str[-i-1]:
                return False
        return True

2.正则

class Solution:
    def isPalindrome(self, s: str) -> bool:
        ss = re.sub('[^A-Za-z0-9]+', '', s).lower() 
        return ss == ss[::-1]

3.双指针

Python two pointer

### LeetCode 第 5 题 &#39;最长回文子串&#39; 的 Python 解法 对于给定字符串 `s`,返回其中的最长回文子串是一个经典算法问题。一种高效的解决方案是利用中心扩展方法来寻找可能的最大长度回文。 #### 中心扩展法解析 该方法基于观察到的一个事实:一个回文串可以由中间向两端不断扩散而得。因此可以从每一个字符位置出发尝试构建尽可能大的回文序列[^1]。 具体来说: - 对于每个字符作为单个字符的中心点; - 或者两个相同相邻字符作为一个整体中心点; - 向两侧延伸直到遇到不匹配的情况为止; 记录下每次找到的有效回文串及其起始索引和结束索引,并更新全局最优解。 下面是具体的 Python 实现代码: ```python def longest_palindrome(s: str) -> str: if not s or len(s) == 0: return "" start, end = 0, 0 for i in range(len(s)): len1 = expand_around_center(s, i, i) len2 = expand_around_center(s, i, i + 1) max_len = max(len1, len2) if max_len > end - start: start = i - (max_len - 1) // 2 end = i + max_len // 2 return s[start:end + 1] def expand_around_center(s: str, left: int, right: int) -> int: L, R = left, right while L >= 0 and R < len(s) and s[L] == s[R]: L -= 1 R += 1 return R - L - 1 ``` 此函数通过遍历整个输入字符串并调用辅助函数 `expand_around_center()` 来计算以当前位置为中心能够形成的最长回文串长度。最终得到的结果即为所求的最大回文子串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值