返回介绍

solution / 0600-0699 / 0680.Valid Palindrome II / README

发布于 2024-06-17 01:03:35 字数 4518 浏览 0 评论 0 收藏 0

680. 验证回文串 II

English Version

题目描述

给你一个字符串 s最多 可以从中删除一个字符。

请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false

 

示例 1:

输入:s = "aba"
输出:true

示例 2:

输入:s = "abca"
输出:true
解释:你可以删除字符 'c' 。

示例 3:

输入:s = "abc"
输出:false

 

提示:

  • 1 <= s.length <= 105
  • s 由小写英文字母组成

解法

方法一:双指针

我们用两个指针分别指向字符串的左右两端,每次判断两个指针指向的字符是否相同,如果不相同,则判断删除左指针对应的字符后字符串是否是回文字符串,或者判断删除右指针对应的字符后字符串是否是回文字符串。如果两个指针指向的字符相同,则将左右指针都往中间移动一位,直到两个指针相遇为止。

如果遍历结束,都没有遇到指针指向的字符不相同的情况,那么字符串本身就是一个回文字符串,返回 true 即可。

时间复杂度 $O(n)$,其中 $n$ 是字符串 $s$ 的长度。空间复杂度 $O(1)$。

class Solution:
  def validPalindrome(self, s: str) -> bool:
    def check(i, j):
      while i < j:
        if s[i] != s[j]:
          return False
        i, j = i + 1, j - 1
      return True

    i, j = 0, len(s) - 1
    while i < j:
      if s[i] != s[j]:
        return check(i, j - 1) or check(i + 1, j)
      i, j = i + 1, j - 1
    return True
class Solution {
  public boolean validPalindrome(String s) {
    for (int i = 0, j = s.length() - 1; i < j; ++i, --j) {
      if (s.charAt(i) != s.charAt(j)) {
        return check(s, i + 1, j) || check(s, i, j - 1);
      }
    }
    return true;
  }

  private boolean check(String s, int i, int j) {
    for (; i < j; ++i, --j) {
      if (s.charAt(i) != s.charAt(j)) {
        return false;
      }
    }
    return true;
  }
}
class Solution {
public:
  bool validPalindrome(string s) {
    for (int i = 0, j = s.size() - 1; i < j; ++i, --j) {
      if (s[i] != s[j]) {
        return check(s, i + 1, j) || check(s, i, j - 1);
      }
    }
    return 1;
  }

  bool check(string s, int i, int j) {
    for (; i < j; ++i, --j) {
      if (s[i] != s[j]) {
        return false;
      }
    }
    return true;
  }
};
func validPalindrome(s string) bool {
  check := func(i, j int) bool {
    for ; i < j; i, j = i+1, j-1 {
      if s[i] != s[j] {
        return false
      }
    }
    return true
  }
  for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
    if s[i] != s[j] {
      return check(i+1, j) || check(i, j-1)
    }
  }
  return true
}
function validPalindrome(s: string): boolean {
  for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) {
    if (s.charAt(i) != s.charAt(j)) {
      return isPalinddrome(s.slice(i, j)) || isPalinddrome(s.slice(i + 1, j + 1));
    }
  }
  return true;
}

function isPalinddrome(s: string): boolean {
  for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) {
    if (s.charAt(i) != s.charAt(j)) {
      return false;
    }
  }
  return true;
}
/**
 * @param {string} s
 * @return {boolean}
 */
var validPalindrome = function (s) {
  let check = function (i, j) {
    for (; i < j; ++i, --j) {
      if (s.charAt(i) != s.charAt(j)) {
        return false;
      }
    }
    return true;
  };
  for (let i = 0, j = s.length - 1; i < j; ++i, --j) {
    if (s.charAt(i) != s.charAt(j)) {
      return check(i + 1, j) || check(i, j - 1);
    }
  }
  return true;
};
public class Solution {
  public bool ValidPalindrome(string s) {
    int i = 0, j = s.Length - 1;
    while (i < j && s[i] == s[j]) {
      i++;
      j--;
    }
    if (i >= j) {
      return true;
    }
    return check(s, i + 1, j) || check(s, i, j - 1);
  }

  private bool check(string s, int i, int j) {
    while (i < j) {
      if (s[i] != s[j]) {
        return false;
      }
      i++;
      j--;
    }
    return true;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文