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