学期考试结束,重新开始刷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.双指针