目录
1. 题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car" 输出: false 解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 10^5
- 字符串
s
由 ASCII 字符组成
2. 方法1
首先遍历去掉非字母和数字字符,然后统一变成小写(或者大写),再判断是否对称。
非字母和数字字符在python中可以用str.isalnum()进行判断,
用str.lower()或者str.upper()可以将字符串中的字符统一变成大写或者小写。
判断是否对称则可以用用s==s[::-1]的简捷方法处理。
代码如下:
class Solution:
def isPalindrome(self, s: str) -> bool:
s1 = ''
for c in s:
if c.isalnum():
s1 = s1 + c
s1 = s1.lower()
return s1 == s1[::-1]
if __name__ == '__main__':
sln = Solution()
print(sln.isPalindrome("A man, a plan, a canal: Panama"))
print(sln.isPalindrome("race a car"))
print(sln.isPalindrome(""))
3. 方法2
方法1利用Python的强大的内置函数,如果没有这些工具可用呢。
可以考虑用双指针法,分别从首尾两端向中间迎头前进,逐个判断每对字符是否相等(忽略大小写的差异),碰到非数字和字母字符就跳过。
代码如下:
class Solution:
def isPalindrome(self, s: str) -> bool:
lptr = 0
rptr = len(s) - 1
while lptr < rptr:
if s[lptr].isalnum():
while rptr >= lptr:
if s[rptr].isalnum():
if s[lptr].lower() != s[rptr].lower():
return False
rptr -= 1
break
rptr -= 1
lptr += 1
return True
在Python中,方法2比运行时间比方法1要慢30%,毕竟内置函数才是最优的。所以用Python实现还是应该用第一种方法。其它没有方便的字符串处理的语言的话可以用方法2。
但是方法2的内存消耗较小。
回到主目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)