可以使用双指针方法来判断字符串是否可以通过删除最多一个字符变成回文字符串。具体实现如下:
代码:
def validPalindrome(s: str) -> bool:
def is_palindrome(sub_s, left, right):
while left < right:
if sub_s[left] != sub_s[right]:
return False
left += 1
right -= 1
return True
left, right = 0, len(s) - 1
while left < right:
if s[left] != s[right]:
# 尝试删除左侧或右侧字符
return is_palindrome(s, left + 1, right) or is_palindrome(s, left, right - 1)
left += 1
right -= 1
return True
# 测试
print(validPalindrome("abca")) # True
print(validPalindrome("racecar")) # True
print(validPalindrome("hello")) # False
解释:
-
使用 双指针,分别从字符串的两端向中间移动。
-
如果遇到不同字符:
-
尝试 删除左指针字符 或 删除右指针字符,然后检查剩下的部分是否是回文。
-
-
如果整个遍历过程中没有遇到不同字符,则原字符串本身就是回文,直接返回
True
。
这种方法的时间复杂度是 O(n),因为最多只需遍历一次字符串并额外检查两次子字符串的回文性。