原文题目:
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]