class Solution:
def isPalindrome(self, s: str) -> bool:
n = len(s)
l, r = 0, n - 1
# 双指针还未相遇时,进行循环
while l < r:
# 当s[l]不是字母或数字时,左指针l后移一位
while l < r and not s[l].isalnum():
l += 1
# 当s[r]不是字母或数字时,右指针r前移一位
while l < r and not s[r].isalnum():
r -= 1
if l < r:
# 若左、右指针指向的字符不相同,则不是回文串
if s[l].lower() != s[r].lower():
return False
# 若左、右指针指向的字符相同,则向中心移动两个指针,
# 判断新的两个字符是否相同
l, r = l + 1, r - 1
return True
680. 验证回文字符串 Ⅱ
class Solution:
def validPalindrome(self, s: str) -> bool:
# 判断某一个字符串是否是回文串
def checkPalindrome(low, high):
i, j = low, high
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
low, high = 0, len(s) - 1
while low < high:
# 若左右指针指向的字符相同,则左右指针向中心移动
if s[low] == s[high]:
low += 1
high -= 1
# 若左右指针指向的字符不相同,则判断:去掉左边字符后是否是回文串 或者
# 去掉右边字符后是否是回文串
else:
return checkPalindrome(low + 1, high) or checkPalindrome(low, high - 1)
return True # 若原始字符串已经是回文串,则直接返回True