125. 验证回文字符串
方法一:思维定势,直接想到用栈 (比较蠢 5.09% 与 30.88%)
var isPalindrome = function(s) { s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase() const stack = [], len = s.length, half = Math.floor(len / 2) for (let i = 0; i < half; i += 1) { stack.push(s[i]) } for (let i = len - 1; i >= half; i -= 1) { if (stack.length && s[i] !== stack.shift()) { return false } } return true };
方法二:直接比较前半段和后半段字符串 (94.17% 和 45.62%)
var isPalindrome = function(s) { s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase() const len = s.length if (len % 2 === 0) { return s.substring(0, len / 2) === s.substring(len / 2, len).split('').reverse().join('') } else { return s.substring(0, (len - 1) / 2) === s.substring((len + 1) / 2, len).split('').reverse().join('') } };
方法三: 双指针 (94.17% 和 47.66%, 可以提前结束)
var isPalindrome = function(s) { s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase() let i = 0, j = s.length - 1 while (i < j) { if (s[i] === s[j]) { i += 1 j -= 1 } else { return false } } return true };
方法四:在方法三上优化,边遍历边忽略不合法的字符,直接遍历一遍完事