给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
解法:
// 解法1:
// 太羡慕那种经验老道,一写写出来的算法就很高效的,我第一个想出来的运行速度太慢了...
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if(s.length === 0 ||s.length === 1) return true;
s = s.replace(/\s*/g,"").toLowerCase();
let str = '';
for(let i = 0; i< s.length; i++ ){
if( (/^[A-Za-z0-9]*$/).test(s[i])) str = str.concat(s[i]);
}
let left = 0;
let right = str.length-1;
while(left < right){
if(str[left] !== str[right]) return false;
left++;
right--;
}
return true;
};
// 解法2:
// 运行速度快了一丢丢,然而还是没有跟上大众的步伐...
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if(s.length === 0 ||s.length === 1) return true;
s = s.replace(/\s*/g,"").toLowerCase();
let left = 0;
let right = s.length-1;
while(left < right){
if(! (/^[A-Za-z0-9]*$/).test(s[left])){
left++;
}else if(! (/^[A-Za-z0-9]*$/).test(s[right])){
right--;
}else{
if(s[left] !== s[right]) return false;
left++;
right--;
}
}
return true;
};
// 解法3:
// 又简洁了一下,又快了一丢丢
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if(s.length === 0 ||s.length === 1) return true;
s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase();
let left = 0;
let right = s.length-1;
while(left < right){
if(s[left] !== s[right]) return false;
left++;
right--;
}
return true;
};
// 解法4:
// 果然调用api是最慢的...
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if(s.length === 0 ||s.length === 1) return true;
let arr = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase().split('');
return arr.join('') === arr.reverse().join('');
};