classSolution:defisPalindrome(self, s:str)->bool:
asc =[]for i inrange(len(s)):
a =ord(s[i])if a>=ord('A')and a<=ord('Z'):
asc.append(a+ord('a')-ord('A'))elif a>=ord('a')and a<=ord('z'):
asc.append(a)elif a>=ord('0')and a<=ord('9'):
asc.append(a)
end =len(asc)-1for i inrange(int(len(asc)/2)):if asc[i]== asc[end]:
end -=1else:returnFalsereturnTrue
升级版
其实python中有很多内置函数可以好好利用
比如lower()函数是统一大小写的
还有isalnum()函数是判断char是否是数字和字母的,如果不是则返回0,是则返回不为0的数字
上面思路的一个步骤:预处理字符,使其只有数字和字母且字母要统一大小写,一行代码就出来了
sgood ="".join(ch.lower()for ch in s if ch.isalnum())
关于这个join()就和list.append()一样
如果不采用双指针的方法,可以直接将新的字符串反转,看反转后的字符串与原字符串是否相等
这个方法完整的代码只有两行,哭,太简单了
classSolution:defisPalindrome(self, s:str)->bool:
sgood ="".join(ch.lower()for ch in s if ch.isalnum())return sgood == sgood[::-1]
还有最省内存的方法
只在原s上判断即可
就是得每次找到真的能比较的位置有点麻烦
classSolution:defisPalindrome(self, s:str)->bool:
n =len(s)
left, right =0, n -1while left < right:while left < right andnot s[left].isalnum():
left +=1while left < right andnot s[right].isalnum():
right -=1if left < right:if s[left].lower()!= s[right].lower():returnFalse
left, right = left +1, right -1returnTrue
文章目录题目我的方法升级版还有最省内存的方法题目注意哦!数字也是有效字符我的方法思路:新建一个列表,储存所有有效字符的Ascii码,并统一大小写,再用双指针遍历一遍列表,看是否回文class Solution: def isPalindrome(self, s: str) -> bool: asc = [] for i in range(len(s)): a = ord(s[i]) if a&g