LeetCode 680 Valid Palindrome II javascript解决方案

题意: 判断一个字符串,能否在最多去除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;
};
复制代码

转载于:https://juejin.im/post/5a30f51df265da431d3cacc2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值