验证回文字符串2

解题思路

  1. 把判断是回文的抽成方法f1,
  2. 如果是直接返回true,
  3. 如果不是找到两个错误的索引,两个索引分别移动一个位置即可

 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;
};

猜你喜欢

转载自blog.csdn.net/qq_29334605/article/details/106219569
今日推荐