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