返回
揭秘LeetCode第680题:验证回文字符串Ⅱ
前端
2024-01-14 09:50:40
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()
方法来简化代码。 - 如果您担心时间复杂度,可以考虑使用动态规划来解决此问题。
- 此问题也可以使用递归来解决,但递归的解法可能会导致栈溢出。
希望这篇文章对您有所帮助。如果您有任何问题或建议,请随时提出。