难度
简单
题目
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 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 = 0right = len(tmp) - 1# 如果字符长度时奇数,不需要比较中间位置# 如果字符长度时偶数,没有中间位置# 所以使用<进行比较while left < right:if tmp[left] == tmp[right]:left += 1right -= 1else:return Falsereturn Trueif __name__ == '__main__':s = "1A man, a plan, a canal: Panama1"s = "raca a car"# s = " "so = Solution()res = so.isPalindrome(s)print(res)