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
};
 
方法四:在方法三上优化,边遍历边忽略不合法的字符,直接遍历一遍完事

 

posted @ 2020-10-16 00:51  rencoo  阅读(177)  评论(0编辑  收藏  举报