题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
解题思路:
设置两个指针,分别从字符串两端向中间遍历,如果两个都是字母但不想等,直接返回false
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
s=s.lower()
l,r=0,len(s)-1
while l<r:
if s[l].isalnum() and s[r].isalnum():#两个都是字母或数字
if s[l]!=s[r]:
return False
l+=1
r-=1
elif s[l].isalnum():
r-=1
elif s[r].isalnum():
l+=1
else:
l+=1
r-=1
return True
评论区答案:
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
1.过滤掉非字母和数字
2.去掉空格等字符
3.转换成小写
比较原字符串与反转后的字符串是否相等
s = ''.join(filter(str.isalnum,s)).lower()
return s==s[::-1]
评论区答案:
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
import re
s = re.sub('\W', '', s).lower()
return s == s[::-1]