1.编辑器
我使用的是win10+vscode+leetcode+python3
环境配置参见我的博客:
链接
2.第一百二十五题
(1)题目
英文:
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
中文:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome
(2)解法
① 使用正则化
第一种:(耗时:48ms,内存:14.9M)
class Solution:
def isPalindrome(self, s: str) -> bool:
p=''.join(re.findall(r'[\w\d]+',s))
p=p.lower()
return True if p==p[::-1] else False
注意:
1.r’[]'这个是正则化的格式,并且有:
*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、、汉字
\W 匹配特殊字符,即非字母、非数字、非汉字、非
2.\d其实是可以不要的。
第二种:(耗时:40ms,内存:14.8M)
class Solution:
def isPalindrome(self, s: str) -> bool:
p=''.join(re.findall(r'[a-zA-Z0-9]+',s))
p=p.lower()
return True if p==p[::-1] else False
② 先列举出所有的可能,再从头尾开始匹配
(耗时:60ms,内存:13.5M)
class Solution:
def isPalindrome(self, s: str) -> bool:
numbers = '1234567890'
letters ='abcdefghijklmnopqrstuvwxyz'
s = s.lower()
s_new = ''
for x in s:
if (x in numbers) or (x in letters):
s_new += x
result = True
half = (len(s_new)-1) // 2
if s_new == "":
return True
for i in range(0,half+1):
if s_new[i] != s_new[len(s_new)-1-i]:
return False
return result
③ 双指针(i和j的追击相遇问题)
(耗时:80ms,内存:13.7M)
class Solution:
def isPalindrome(self, s: str) -> bool:
i, j = 0, len(s) - 1
while i < j:
while i < len(s) and not s[i].isalnum():
i += 1
while j > -1 and not s[j].isalnum():
j -= 1
if i > j:
return True
if s[i].upper() != s[j].upper():
return False
else:
i += 1
j -= 1
return True