题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
解题思路
我的思路 答案(一)
弄出一个有效的字符集,也就是包含所有的字母和数字;然后弄2个游标从整个字符串左边和右边依次移动一格,如果遇到不是有效集合的元素,就再移动一步。
在每次双向移动的过程中,判断指向的两个元素是否相等,如果不相等,那么就返回False。
别人思路 答案(二)
回文字符串,可以用到字符串反转的方法也就是str = str[::-1];
然后,判断是否是数字和字母也有一个方法str.isalnum()
因此,先将所有元素转换成小写,然后通过这个方法,将原始的字符串变成只包含字母和数字的,最后判断原字符串和反转字符串是否相等即可。
答案(一)
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
if s == '':
return True
data_set = 'abcdefghijklmnopqrstuvwxyz0123456789'
s = s.lower()
index_s = 0
index_e = len(s) - 1
while index_s < index_e:
while index_s < index_e:
if s[index_s] not in data_set:
index_s += 1
else:
break
while index_s < index_e:
if s[index_e] not in data_set:
index_e -= 1
else:
break
if index_s == index_e - 1:
if s[index_s] not in data_set or s[index_e] not in data_set:
return True
else:
if s[index_s] == s[index_e]:
return True
else:
return False
if index_s < index_e and s[index_s] != s[index_e]:
return False
else:
index_s += 1
index_e -= 1
return True
答案(二)
class Solution:
def isPalindrome(self, s: str) -> bool:
if not s:
return True
s = s.lower()
s = [s[i] for i in range(len(s)) if s[i].isalnum()]
return s==s[::-1]