返回

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

前端

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

题干:

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

示例:

输入:s = "aba"
输出:true
输入:s = "abca"
输出:true
输入:s = "abc"
输出:false

解题思路:

关于这道题的解法,其实也是采用双指针,首先看到回文数我们应该第一个想到的就是双指针,但是对于此题还有一个要求,就是最多删除一个字符,所以我们不能直接采用双指针,而是需要考虑一下删除一个字符的情况。

我们可以使用两个指针分别指向字符串的首尾,然后逐个比较两个指针指向的字符是否相等,如果相等则继续比较下一个字符,直到两个指针相遇或超过字符串中间位置。

如果在比较过程中发现两个指针指向的字符不相等,则需要考虑删除一个字符的情况。我们可以尝试删除左指针指向的字符,或者删除右指针指向的字符,然后继续比较剩下的字符串是否回文。

如果删除左指针指向的字符后,剩下的字符串是回文,则返回 true;否则,如果删除右指针指向的字符后,剩下的字符串是回文,则返回 true;否则,返回 false。

代码实现:

def valid_palindrome(s):
  """
  :type s: str
  :rtype: bool
  """
  left, right = 0, len(s) - 1

  while left < right:
    if s[left] != s[right]:
      return is_palindrome(s[left:right]) or is_palindrome(s[left + 1:right + 1])
    left += 1
    right -= 1

  return True


def is_palindrome(s):
  """
  :type s: str
  :rtype: bool
  """
  left, right = 0, len(s) - 1

  while left < right:
    if s[left] != s[right]:
      return False
    left += 1
    right -= 1

  return True

额外见解和技巧:

  • 如果您对字符串处理比较熟悉,可以使用内置的 str.startswith()str.endswith() 方法来简化代码。
  • 如果您担心时间复杂度,可以考虑使用动态规划来解决此问题。
  • 此问题也可以使用递归来解决,但递归的解法可能会导致栈溢出。

希望这篇文章对您有所帮助。如果您有任何问题或建议,请随时提出。