给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
该题要求判断字符串是否为回文串,而且只考虑不区分大小写的字母和数字。因此解决该题可以分为两步:
-
依次访问字符串中的的元素,只保留字符和数字
-
设置两个指针
p
和q
分别指向头和尾,然后判断指向的元素是否相同- 如果相同则
p
往后移,q
往前移,直到p >= q
- 如果中间有不同之处,则直接返回
False
- 如果相同则
AC code:
class Solution:
def isPalindrome(self, s: str) -> bool:
if s == '': return True
# 先将s转换为小写形式
s = s.lower()
# 合法字符
numbers = '1234567890'
letters ='qwertyuiopasdfghjklzxcvbnm'
res = [s[i] for i in range(len(s)) if s[i] in numbers + letters]
l, r = 0, len(res) - 1
while l <= r:
if res[l] == res[r]:
l += 1
r -= 1
else:
return False
return True
或者可以求出中点后比较中点左右的字符串是否是对称的。
class Solution:
def isPalindrome(self, s: str) -> bool:
if s == '': return True
s = s.lower()
numbers = '1234567890'
letters ='qwertyuiopasdfghjklzxcvbnm'
res = [i for i in s if i in numbers + letters]
return res == res[::-1]