原文题目:
125. Valid Palindrome
读题:
125. Valid Palindrome
读题:
该题目就是给定一组字符串,然后只检查字符串中的字母和数字,并且忽略字母的大小写,然后判断是否为回文
思路:解法一:循环遍历字符串,将非字母非数字的字符用''直接替换掉得到纯字母数字字符串,然后忽略大小写lower()或者upper()判断是否为回文
该解法时间复杂度不符合leetcode的要求,运行时间超时
解法二:给定两个指针,指针1从前往后遍历,指针2从后往前遍历,碰到非字母非数字字符则跳过,然后依次比较,如果有不等的则不是回文,该解法已经提交AC了
'''解法一'''
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
if not s:
return True
for char in s:
if not char.isalpha() and not char.isdigit(): #非数字非字母
s = s.replace(char,'') #替换
res = s.upper() #转为大写字母
result = True if res == res[::-1] else False #res[::-1]就是将res翻转
return result
'''解法二'''
class Solution(object):
def istarget(self, char):
if char.isdigit() or char.isalpha():
return True
return False
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
if not s:
return True
length = len(s)
i = 0
j = length -1
while i < j:
if self.istarget(s[i]) and self.istarget(s[j]): #同时为数字或者字母
if s[i].lower() != s[j].lower():
return False
i += 1
j -= 1
elif self.istarget(s[i]) and not self.istarget(s[j]): #后指针非数字非字母跳过
j -= 1
elif not self.istarget(s[i]) and self.istarget(s[j]): #前指针非数字非字母跳过
i += 1
else: #同时为非数字非字母
i += 1
j -= 1
return True
'''解法三'''
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
cleanlist = [c for c in s.lower() if c.isalnum()]
return cleanlist == cleanlist[::-1]