给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
示例:
输入:“A man, a plan, a canal: Panama”
输出:true
输入: "race a car"
输出: false
此处需要提醒自己,回文串是指从头读到尾和从尾读到头都是一样的。
我一开始写的代码,竟然卡壳了,卡在这里
class Solution:
def isPalindrome(self, s: str) -> bool:
assert len(s)>0
start,end=0,len(s)
s=list(s.lower())
while start<end:
if s[start]==s[end]:
start+=1
end-=1
elif s[start],s[end] in [",",":"]:
start+=1
end-=1
else:
我一开始想用两个首尾两个指针扫描,然后看到相同的就移动,看到字符就移动,然后就发现循环出口找不到了。
后来我看了官方答案,大致理清楚了思路,首先先按照题目判别字符串是否由字母和数字组成,用这个函数isalnum(),如果是的话,再将对应字母进行统一小写转换,然后判断如果对应位置相等,则同时前移后移,然后用continue 跳出当前内循环,继续进入while外循环。目的是为了使得首尾指针遍历完成,当首尾指针遍历完了,即start>=end,那么就意味着字符串是符合回文串的规则,则可以返回true
所以代码应该是这样
class Solution:
def isPalindrome(self, s: str) -> bool:
if len(s)<=1:return True
start,end=0,len(s)-1
while start<end:
if s[start].isalnum() and s[end].isalnum():
if s[start].lower()==s[end].lower():
start+=1
end-=1
continue
else:
return False
elif s[start].isalnum():
end-=1
elif s[end].isalnum():
start+=1
else:
start+=1
end-=1
return True
这里我探索得出
elif s[start].isalnum():
end-=1
elif s[end].isalnum():
start+=1
这两句是为了跳过逗号,冒号,即如果开头的仍符合字符串的元素规则,而又不符合首尾相等,而且循环还没有跳出,说明尾部指针指向的肯定就是逗号,冒号这些符号,那么就讲尾部指针进行移动。
测试用例:
def isPalindrome(s):
if len(s)<=1:return True
start,end=0,len(s)-1
while start<end:
if s[start].isalnum() and s[end].isalnum():
if s[start].lower()==s[end].lower():
start+=1
end-=1
continue
else:
return False
elif s[start].isalnum():
end-=1
elif s[end].isalnum():
start+=1
else:
start+=1
end-=1
return True
print(isPalindrome("A man, a plan, a canal: Panama"))