欢迎查看和关注一个开源的个人学习计算机科学知识成长记录(前后端,数据结构与算法)
125. 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)
解法
- 利用正则表达式 只保留数字和字符
let newS = s.toLowerCase().match(/[a-z0-9]+/g);
console.log(newS);// ['i','am', 'bill', 'llib', 'ma', ]
// 使用match方法在字符串内索引指定值/找到一个或多个正则表达式的匹配
// 查找从a到z的字符,并返回匹配值
var isPalindrome = function(s){
// 正则匹配
let isValid = s.toLowerCase().match(/[a-z0-9]+/g);
if(!valid){
return true;
}
let str = valid.join(''); // 数据预处理
let comp = str.split('').reverse('').join('');
return comp === str;
}
- 双指针
最开始想到了用数组来存储有用的数据,然后再用双指针去左右取值,遇到不想等的情况就返回结果:
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
s = s.toLowerCase();
let str = []
for(let i=0;i<s.length;i++){
if(('a'<=s[i]&&s[i]<='z')||('0'<=s[i]&&s[i]<='9')){
str.push(s[i])
}
}
let start = 0, end = str.length-1;
while(start<end){
if(str[start]!==str[end]){
return false;
}
start++;
end--;
}
return true;
};
执行结果:通过
执行用时:84 ms, 在所有 JavaScript 提交中击败了48.33%的用户
内存消耗:44.9 MB, 在所有 JavaScript 提交中击败了25.59%的用户
通过测试用例:480 / 480
下面是其他大神的解法:
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
let str = s.toLowerCase();
let i = 0;
let j = str.length - 1;
while(i<j){
if(!isValid(i)){
i++;
continue;
}
if(!isValid(j)){
j--;
continue;
}
if(str[i]!==str[j]){
return false;
}
i++;
j--;
}
return true;
};
var isValid = function(str){
return (str>='a'&&str<='z')||(str>='0'&&str<='9');
}
参考链接
125. 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)
验证回文串 - 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)
用时 99.58% 先处理成只有需要判断的字符 - 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)
【JavaScript 注释齐全】三种经典方法( reverse+双指针+栈)解决经典题-验证回文串 - 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)