一. 题目
-
题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。 -
示例
二. 方法一
-
解题思路
- 先去掉原字符串中两端的空格以及将其中的小写字母转成大写字母
- 创建两个指针, 分别指向整理后字符串的头尾
- 如果头指针小于尾指针, 且头指针所指元素不是字母或数字, 则索引 + 1
- 如果头指针小于尾指针, 且尾指针所指元素不是字母或数字, 则索引 - 1
- 如果头尾指针指向的元素都是数字或字母, 则比较元素是否相等
- 如果相等, 则继续比较, 直到比较到头指针不小于尾指针
- 如果不相等, 则直接返回False
- 最终返回True
-
解题代码
def isPalindrome(self, s: str) -> bool: # 先去掉原字符串中两端的空格以及将其中的小写字母转成大写字母 s = s.strip().upper() # 创建两个指针, 分别指向整理后字符串的头尾 left = 0 right = len(s) - 1 while right > left: # 如果头指针小于尾指针, 且当前元素不是字母或数字, 则跳过 while not s[left].isalnum() and left < right: left += 1 while not s[right].isalnum() and left < right: right -= 1 # 此时头尾元素均是字母或者数字 # 如果相等, 则继续比较下一对元素; 如果不相等,则直接返回false if s[left] == s[right]: left += 1 right -= 1 else: return False # 如果运行到最后, 则返回True else: return True
-
分析
时间复杂度: O(n)
空间复杂度: O(1)