题目:
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
答案:
方法一:双指针:指针left、right分别指向字符串s的左右两侧,如果left = right 那么left+1, right-1,直到两者相遇,返回True 。若不相等,则返回False
class Solution:
def isPalindrome(self, s: str) -> bool:
sgood = "".join(
ch.lower()
for ch in s
if ch.isalnum()
)
n = len(sgood)
left = 0
right = n-1
while left < right:
if sgood[left] != sgood[right]:
return False
left = left + 1
right = right - 1
return True
方法二:
在原字符串上直接判断:同样使用双指针,但是是直接在原字符串上进行判断,每次将指针移动到下一个字母字符或数字字符,再判断这两个字符是否相等。
class Solution:
def isPalindrome(self, s: str) -> bool:
n = len(s)
left = 0
right = n-1
while left < right:
while left < right and not s[left].isalnum():
left = left + 1
while left < right and not s[right].isalnum():
right = right - 1
if left < right:
if s[left].lower() != s[right].lower():
return False
left = left + 1
right = right - 1
return True