1.1、基本解法给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama” 输出: true 示例 2:
输入: “race a car” 输出: false
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
首先将字符串转成小写,之后提取出字符串中的数字和字母。比较前半段和后半段内容是否相等。
1.2、代码# -*- coding: utf-8 -*-
'''
题目简述:
给定一个字符串,验证其是否是回文串。仅考虑字母和数字。
基本思路:
首先将字符串中中所有元素转成小写,然后提取出数字和字母。
在结合python切片比较前后两半段是否相等。
'''
class Solution():
def isString(self,s):
if len(s) < 2:
return True
s = s.lower() # 转成小写
slist = []
for word in s:
if word.isalnum(): # 若是小写or字母
slist.append(word)
mid = len(slist) // 2
if slist[:mid] == slist[::-1][:mid]:
return True
return False
if __name__ == '__main__':
s = 'aba'
solu = Solution()
res = solu.isString(s)
print('结果为\n',res)
2.1、双指针解法
建立前后两个指针,比较两个指针对应的元素是否相等。直至比较两个指针相遇。
2.2、代码# -*- coding: utf-8 -*-
'''
题目简述:
给定一个字符串,验证其是否是回文串。仅考虑字母和数字。
基本思路:
设置两个指针,比较元素是否相等,直至两个指针碰头。
'''
class Solution():
def isString(self,s):
if len(s) < 2:
return True
s = s.lower()
left = 0
right = len(s) -1
# 开始比较
while left < right:
if not s[left].isalnum(): # 若不是字母或数字
left+=1
continue
if not s[right].isalnum():
right-=1
continue
if s[left].isalnum() and s[right].isalnum():
if s[left] != s[right]:
return False
else:
left+=1
right-=1
return True
if __name__ == '__main__':
s = "A man, a plan, a canal: Panama"
solu = Solution()
res = solu.isString(s)
print('结果为\n',res)
总结
a. 方法一中 : 验证一个字符是否是 数字or字母: 调用现成api。word.isalnum(); 另外,比较前后两半段是否相等。主要是后半段的处理很巧妙。先将字符串倒序然后比较前mid个元素。这样保证了前后两半段待比较元素数量相同。而不会因为字符串中字母的奇数偶数数量而出差。
b. 不论法一还是法二: 均存在一个细节。即 s = s.lower(),仅仅在程序中s.lower()并不会改变原始字符串。实质上开辟了一块新内存。因此,必须赋值给s。否则不起作用。