返回介绍

lcof2 / 剑指 Offer II 019. 最多删除一个字符得到回文 / README

发布于 2024-06-17 01:04:42 字数 4086 浏览 0 评论 0 收藏 0

剑指 Offer II 019. 最多删除一个字符得到回文

题目描述

给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。

 

示例 1:

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

示例 2:

输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符

示例 3:

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

 

提示:

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

 

注意:本题与主站 680 题相同: https://leetcode.cn/problems/valid-palindrome-ii/

解法

方法一:双指针

我们用两个指针 $i$ 和 $j$ 分别指向字符串 $s$ 的第一个字符和最后一个字符,然后向中间移动指针,每次判断 $s[i]$ 和 $s[j]$ 是否相等:

  • 如果 $s[i] = s[j]$,则指针 $i$ 向后移动一位,指针 $j$ 向前移动一位;
  • 否则,存在两种情况,即删除字符 $s[i]$ 或者删除字符 $s[j]$,然后判断删除之后的字符串是否是回文字符串。即判断子串 $s[i+1..j]$ 或者子串 $s[i..j-1]$ 是否是回文字符串。

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

class Solution:
  def validPalindrome(self, s: str) -> bool:
    def check(i: int, j: int) -> bool:
      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 + 1, j) or check(i, j - 1)
      i, j = i + 1, j - 1
    return True
class Solution {
  private String s;

  public boolean validPalindrome(String s) {
    this.s = s;
    for (int 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;
  }

  private boolean check(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) {
    auto check = [&](int i, int j) {
      for (; i < j; ++i, --j) {
        if (s[i] != s[j]) {
          return false;
        }
      }
      return true;
    };
    for (int i = 0, j = s.size() - 1; i < j; ++i, --j) {
      if (s[i] != s[j]) {
        return check(i + 1, j) || check(i, j - 1);
      }
    }
    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 {
  const check = (i: number, j: number): boolean => {
    for (; i < j; ++i, --j) {
      if (s[i] !== s[j]) {
        return false;
      }
    }
    return true;
  };
  for (let i = 0, j = s.length - 1; i < j; ++i, --j) {
    if (s[i] !== s[j]) {
      return check(i + 1, j) || check(i, j - 1);
    }
  }
  return true;
}
/**
 * @param {string} s
 * @return {boolean}
 */
var validPalindrome = function (s) {
  const check = (i, j) => {
    for (; i < j; ++i, --j) {
      if (s[i] !== s[j]) {
        return false;
      }
    }
    return true;
  };
  for (let i = 0, j = s.length - 1; i < j; ++i, --j) {
    if (s[i] !== s[j]) {
      return check(i + 1, j) || check(i, j - 1);
    }
  }
  return true;
};

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

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

发布评论

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