LeetCode 680 Valid Palindrome II javascript解决方案

648 阅读1分钟

题意: 判断一个字符串,能否在最多去除1个字符的情况下,成为回文,即从头开始读和从尾开始读是一致的。 link:https://leetcode.com/problems/valid-palindrome-ii/description/

Attemp1: 利用str.split('').reverse().join(''), 可以很方便的反转字符串。 先判断这个字符串本身是不是回文,再对字符串执行个循环,一个个字符串去除比对,能否成为回文。 本身题目是easy 就懒得考虑性能了。 没想到Time exceeded, sad。。。

Attemp2: 用function外的变量attempt,记录去除字符数目,一旦超出1,返回false。 对字符从头开始进行循环,一半之前结束,比对 arr[0] (即头) 和 arr[arr.length - 1] (即尾) 是否一样,一样的话就去头去尾,一直到字符串的长度小于2。 当然,如果头尾不一样,tolerate++,如果tolerate > 1,直接out,不大于1,创建2个字符串,arr_left,就把arr[0]删除生成的arr,跟arr_right,就把arr[arr.length - 1]删除生成的arr,递归调用,返回 validPalindrome(arr_left) || validPalindrome(arr_right)。 有2个需要注意的地方: 1、不能直接用arr_left = arr; arr_left.splice(0, 1), 浅拷贝,对arr_left的任何操作会直接影响arr,后面的arr_right就会受到影响,有个trick: arr_left = JSON.parse(JSON.stringify(arr))。这样就不会指向同一个地址啦。 2、把string转换成array处理更方便。 if(!Array.isArray(str)){ str = str.split(‘’) } 3、leetCode在function外面定义的tolerate变量,在实际submit code执行的时候,会失效,得把tolerate写在function里面。 if(typeof tolerate === 'undefined'){ tolerate = 0; } 贴代码:

/**
 * @param {string} s
 * @return {boolean}
 */
var validPalindrome = function(s, tolerate) {
    if(typeof(tolerate) === 'undefined'){
        tolerate = 0;
    }
    if(!Array.isArray(s)){
        s = s.split('');
    }
    while(s.length > 1){
        if(s[0] == s[s.length - 1]){
            s.splice(0, 1);
            s.splice(s.length - 1, 1);
        }else{
            tolerate++;
            if(tolerate > 1)
                return false;
            let sLeft = JSON.parse(JSON.stringify(s));
            sLeft.splice(0, 1);
            let sRight = JSON.parse(JSON.stringify(s));
            sRight.splice(sRight.length - 1);
            return validPalindrome(sLeft, tolerate) || validPalindrome(sRight, tolerate);
        }
    }
    return true;
};