题目描述:
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.
Example 1:
Input: “A man, a plan, a canal: Panama”
Output: true
Example 2:
Input: “race a car”
Output: false
判断回文串,除了字母和数字之外的字符都忽略掉。算法思想比较简单,不要忽略空字符和大小写情况。我一共用了三种方法来写,思想一样,实现略有不同。将后半部分反转之后和前半部进行比较的方法处理速度更快一些。
方法1:替换函数处理,O(n)比对,速度快
使用upper进行大小写处理
使用正则表达式和sub()函数对串的内容进行处理
class Solution:
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
import re
#result = False
temp = re.sub(r'[^a-zA-Z0-9]','',s)
#print(1,temp)
length = len(temp)
if length <= 1:
return True
start = 0
end = length-1
while(start <= end):
temp1 = temp[start]
temp2 = temp[end]
if temp1.upper()!= temp2.upper():
return False
start += 1
end -= 1
return True
如果避免了多余的大小写转化之后,速度快了一丢丢,这段处理改为:
if temp1.isupper():
temp1=temp1.lower()
if temp2.isupper():
temp2=temp2.lower()
if temp1 != temp2:
return False
方法2:常规判断,一次对比,速度慢
isnumeric() isalpha() 函数运用
方法3:后半部分反转和前部分比较
str类型转换为list,再reverse()
class Solution:
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
import re
#result = False
temp = re.sub(r'[^a-zA-Z0-9]','',s)
length = len(temp)
if length <= 1:
return True
temp=temp.lower()
#print(temp)
length = len(temp)
if length <= 1:
return True
n = length//2
m = length%2
#print(length,n,m)
r=list(temp[n+m:])
r.reverse()
p= list(temp[0:n])
return r == p
很简单的题,用了三种方法来写,比较了速度。新学习了几个字符串操作的函数。isnumeric isalpha list(str).reverse isupper islower upper lower