给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
输入: “A man, a plan, a canal: Panama” ,输出: true
输入: “race a car” , 输出: false
解法一:
将字符串转成大写,删除字符串中数字和字母之外的符号,一个新变量 turn 接收翻转后的字符串, 判断 s , turn 是否相等。
复杂度O(n),可能是函数用太多了速度看起来慢
var isPalindrome = function(s) {
s = s.toUpperCase().split("");
for(let i=0;i<s.length;i++) {
if( (s[i]<='Z' && s[i]>='A') || (s[i]>='0' && s[i] <='9') ){
}else{
s.splice(i,1);
i--;
}
}
s=s.join("")
var turn=s.split("").reverse().join("")
return s==turn ? true : false;
}
执行用时:2012 ms
已经战胜 3.75 % 的 javascript 提交记录
解法二:
建立map,并且使用双指针
var isPalindrome = function(s) {
var arr={"a":1,"b":1,"c":1,"d":1,"e":1,"f":1,"g":1,"h":1,"i":1,"j":1,"k":1,"l":1,"m":1,
"n":1,"o":1,"p":1,"q":1,"r":1,"s":1,"t":1,"u":1,"v":1,"w":1,"x":1,"y":1,"z":1,
"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"0":1};
s = s.toLowerCase();
var len=s.length-1
for(let i=0,j=len;i<j;) {
if( arr[s[i]]==1 && arr[s[j]]==1){
if(s[i]!=s[j]) return false;
i++;j--
}else {
if(arr[s[i]] !=1) i++
if(arr[s[j]] !=1) j--
}
//console.log(s[i],s[j],i,j)
}
return true;
};
执行用时:88 ms
已经战胜 91.28 % 的 javascript 提交记录