题目描述:给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。
样例:
"A man, a plan, a canal: Panama" 是一个回文。
"race a car" 不是一个回文。
之前判断过一个链表十分是回文链表(详见:点击打开链接),字符串的判断比链表简单,因为可以从后往前回溯。
但是在这道题当中,空格,标点,以及其他非字母或数字的字符是不能算在内的,所以,我们考虑这样来设计:
还是两个指针,left和right,一个从左往右,一个从右往左遍历字符串,碰到非字母或数字的跳过,碰到字母或数字则进行比较。
代码如下:
class Solution:
# @param {string} s A string
# @return {boolean} Whether the string is a valid palindrome
def isPalindrome(self, s):
left, right = 0, len(s) - 1
while left < right:
# 查找左边的是字母或数字的位置
while left < right and not s[left].isalnum():
left += 1
# 查找右边的是字母或数字的位置
while left < right and not s[right].isalnum():
right -= 1
# 若它们的小写形式不等,返回False
if s[left].lower() != s[right].lower():
return False
left += 1
right -= 1
return True
# Write your code here