LeetCode第680题: 验证回文字符串 Ⅱ

题干

给定一个非空字符串 s最多删除一个字符。判断是否能成为回文字符串。

解法:双指针

关于这道题的解法,其实是也是采用双指针,首先看到回文数我们应该第一个想到的就是双指针,但是对于此题还有一个要求就是需要我们删除一个元素后也可以构成一个回文数。所以再我们进行回文数判断时就应该判断当不相等时,分别从左右指针处开始再次判断中间的子字符串即可。

执行用时:112 ms, 在所有 JavaScript 提交中击败了45.49%的用户

内存消耗:45.3 MB, 在所有 JavaScript 提交中击败了61.89%的用户

var validPalindrome2 = function (s) {
    let begin = 0, end = s.length - 1;
    while (begin < end) {
        if (s[begin] != s[end]) {
            return isValidPalindrome(s, begin + 1, end) || isValidPalindrome(s, begin, end - 1)
        }
        begin += 1;
        end -= 1;
    }
    return true;
}
function isValidPalindrome(s, begin, end) {
    while (begin < end) {
        if (s[begin] != s[end]) {
            return false
        }
        begin += 1;
        end -= 1;
    }
    return true;
}
复制代码

错误的思想:

我在这里做这道题的时候,使用了类似的思想但是总是通过不了:

最后仔细想了以下,发现时自己再删除回文数时候哪里有错。我的理解时如果要删除一个字符的话,比如

abcdcbaa这里的倒数第二个字符时多余的,因此我们有两种情况,假设现在begin=1,end=6,那么如果是回文数则符合[begin+1]=[end]或者[end-1]=[begin],这样容易搞乱思维。然后设置一个计数器记录,这种情况如果超过一个的情况就返回false,结果是我太低估回文数了。

  var validPalindrome = function (s) {
    let begin = 0, end = s.length - 1;
    let nonum = 0;
    while (begin < end) {
       if (nonum > 1) {
          return false
        } else {
          if (s[begin] == s[end]) {
            begin += 1;
            end -= 1;
          } else {
            if (s[begin + 1] == s[end]) {
              nonum += 1
              begin += 1
              continue
            } else if (s[end - 1] == s[begin]) {
              nonum += 1
              end -= 1;
              continue
            } else {
              return false
            }
          }
    }
    return true
  }
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享