leedcode-指针篇(4)

125. 验证回文串(1)

题目

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
示例:

输入:“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"))

你可能感兴趣的:(leedcode刷题,leetcode)