题目:给定一个非空字符串 s
,最多删除一个字符。判断是否能成为回文字符串。
PS:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
一刷:
利用左边右边不等就往前进一位在进行判断
class Solution:
def validPalindrome(self, s: str) -> bool:
print(s[::-1])
flag = 0
l = len(s)
left = 0
right = 1
i = 0
# 记录位置如果去错位置再换一遍
drop_ = 0
flag2 = 0
while(i <= l/2):
if s[i+left] != s[l-i-right]:
if flag2 == 1:
return False
flag += 1
if flag > 1:
i = drop_
left = 1 if left == 0 else 0
right = 1 if right != 1 else 2
flag2 = 1
flag -= 1
elif i+left+1 == l-i-right:
return True
elif s[i+left+1] == s[l-i-right]:
left += 1
drop_ = i
elif s[i+left] == s[l-i-right-1]:
right += 1
drop_ = i
else:
return False
else:
i += 1
if flag <= 1:
return True
再简洁一点:
class Solution:
def validPalindrome(self, s: str) -> bool:
def checkPalindrome(low, high):
i, j = low, high
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
low, high = 0, len(s) - 1
while low < high:
if s[low] == s[high]:
low += 1
high -= 1
else:
return checkPalindrome(low + 1, high) or checkPalindrome(low, high - 1)
return True