解题思路
- 把判断是回文的抽成方法f1,
- 如果是直接返回true,
- 如果不是找到两个错误的索引,两个索引分别移动一个位置即可
var validPalindrome = function (str) {
function f1(start, end, str) {
let mid = Math.floor(str.length / 2);
let err_start = null, err_end = null;
while (start <= mid && end >= mid) {
if (str[start] !== str[end]) {
err_start = start;
err_end = end;
return [err_start, err_end]
} else {
start++;
end--;
}
}
return true;
}
let start = 0, end = str.length - 1;
let res = f1(start, end, str);
if (res === true) return true;
let [s, e] = res;
let r1 = f1(s + 1, e, str)
let r2 = f1(s, e-1, str)
return r1 === true || r2 === true;
}
进一步整理如下
var validPalindrome = function(s, flag = true) {
let l = 0, r = s.length - 1;
while (l < r && s[l] === s[r]) l++, r--;
if (r <= l) return true;
if (flag == true) return validPalindrome(s.slice(l, r), false) || validPalindrome(s.slice(l + 1, r + 1), false)
return false;
};