问题来源:力扣算法面试汇总
问题描述:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
例子:
输入: “A man, a plan, a canal: Panama”
输出: true
# 输入
s = "A man, a plan, a canal: Panama"
1. O ( n ) O(n) O(n)
思路:很简单,给两个指针,一个从字符串开端开始往后遍历,一个从字符串末尾开始往前遍历,当两个指针相遇,则终止
# 功能:判断字符串是否为回文
# 输入:字符串
# 输出:布尔值
def isPalindrome(s):
# 空字符串
if len(s) == 0: return True
# 非空字符串
new_s = []
# 第一遍遍历:提取字母或者数字,字母小写
for letter in s.lower():
if letter.isalpha() or letter.isdigit():
new_s.append(letter)
#print(new_s)
# 第二遍遍历:双头往中间遍历,并比较是否相同
i, j = 0, len(new_s)-1
while i < j:
#print('i, j=', i, j)
if new_s[i] == new_s[j]:
i += 1
j -= 1
else:
return False
return True
2. 更快的算法
这里需要两个小工具:
def isPalindrome(s):
s1 = [*filter(str.isalnum, s.lower())]
return s1 == s1[::-1]