每天一道算法题:125. 验证回文串

难度

简单

题目

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true_ ;否则,返回 false _。

示例 1:

输入: s = “A man, a plan, a canal: Panama” 输出:true 解释:“amanaplanacanalpanama” 是回文串。

示例 2:

输入:s = “race a car” 输出:false 解释:“raceacar” 不是回文串。

示例 3:

输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 “” 。 由于空字符串正着反着读都一样,所以是回文串。

提示:

  • 1 <= s.length <= 2 * 105
  • s 仅由可打印的 ASCII 字符组成

思路

1、将所有大写字符转换为小写字符,再移除所有非字母数字字符
2、使用双指针,left 指向字符串最左边,right 指向最右端
3、判断 left 和 right 所指的值是否相同,如果相同 left 向右移动一位,right 向左移动一位,直到 left 和 right 相遇,则字符串就是回文串,如果没有相遇字符串就不是回文串。

代码

class Solution:
    def isPalindrome(self, s: str) -> bool:
        # 去掉非字母数字字符
        tmp = [x.lower() for x in s if x.isalnum()]

        left = 0
        right = len(tmp) - 1
        # 如果字符长度时奇数,不需要比较中间位置
        # 如果字符长度时偶数,没有中间位置
        # 所以使用<进行比较
        while left < right:
            if tmp[left] == tmp[right]:
                left += 1
                right -= 1
            else:
                return False

        return True


if __name__ == '__main__':
    s = "1A man, a plan, a canal: Panama1"
    s = "raca a car"
    # s = " "
    so = Solution()
    res = so.isPalindrome(s)
    print(res)

你可能感兴趣的:(算法实战,算法)