xqn2017

导航

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]

  

posted on 2017-12-08 19:12  xqn2017  阅读(113)  评论(0编辑  收藏  举报