题目
给定一个非空字符串 s
,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: “aba”
输出: True
示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。
注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
方案一(暴力法)
class Solution:
def validPalindrome(self, s: str) -> bool:
if self.isPalindrome(s):
return True
for i in range(len(s)):
if self.isPalindrome(s[:i] + s[i+1:]):
return True
return False
def isPalindrome(self, s: str) -> bool:
length = len(s)
for i in range(length // 2):
if s[i] != s[length - i - 1]:
return False
return True
- 时间复杂度
-
方案二(递归)
class Solution:
def validPalindrome(self, s: str) -> bool:
def helper(s: str, isDeleted: bool) -> bool:
length = len(s)
if length <= 1:
return True
if s[0] == s[length - 1]:
return helper(s[1:length-1], isDeleted)
elif isDeleted: # 已经删除过字符了
return False
else:
return helper(s[1:], True) or helper(s[:length-1], True)
return helper(s, False)
方案三(双指针)
class Solution:
def validPalindrome(self, s: str) -> bool:
if len(s) <= 0:
return False
if s == s[::-1]:
return True
left = 0
right = len(s) - 1
while left < right:
if s[left] == s[right]:
left += 1
right -= 1
else:
s1 = s[:left] + s[left+1:]
s2 = s[:right] + s[right+1:]
if s1 == s1[::-1] or s2 == s2[::-1]:
return True
else:
return False
参考链接
https://leetcode-cn.com/explore/featured/card/2020-top-interview-questions/281/string/1258/