给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
1.验证有效字符并以小写或者大写形式存储起来
2.利用双指针将首位元素进行对比,全部对应位置上相同判断为回文字符串
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function (s) {
let isValidElem = (s) => {
let str = 'qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM' //有效的字符
return str.indexOf(s) > -1 //判断是否为有效字符
}
let stack = [] //存储有效字符串
for (let i = 0; i < s.length; i++) {
if (isValidElem(s[i])) {
stack.push(s[i].toLocaleLowerCase()) //小写字母存储有效字符串
}
}
let left = 0, right = stack.length - 1; //双指针
while (left < right) {
if (stack[left] !== stack[right]) return false
left++ //左指针
right-- //右指针
}
return true
};
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
def isValidElem(self, s1): ##判断是否为有效字符串
return '0' <= s1 <= '9' or 'a' <= s1 <= 'z' or 'A' <= s1 <= 'Z'
stack = [] ## 存储有效字符串
for i in range(len(s)):
if isValidElem(self,s[i]):
stack.append(s[i].lower()) ## 小写提出有效字符串
left, right = 0, len(stack)-1 ## 双指针遍历
while left < right:
if stack[left] != stack[right]: ## 判断首尾是否相同
return False
left +=1
right-=1
return True