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