680. 验证回文字符串 Ⅱ
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
示例 1:
输入: "aba"
输出: True
示例 2:
输入: "abca"
输出: True
解释: 你可以删除c字符。
注意: 1. 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
思路:
双指针:i从下标0往后、j从下标len(s)-1往前;
当不匹配时,将i或j向前移动一步,再进行匹配;
关键:不匹配时先移动哪个指针。
1 class Solution(object): 2 def validPalindrome(self, s): 3 """ 4 :type s: str 5 :rtype: bool 6 """ 7 # 设置双指针 8 i, j = 0, len(s) - 1 9 # 设置标记——确保最多删除一个字符 10 flag = True 11 while i < j: 12 if s[i] != s[j]: 13 # 若遇到不回文,先判断标记:若为true说明之前没有遇到过不回文 14 if not flag: 15 return False 16 # 若i移动之后回文 17 if s[i+1:j][::-1] == s[i+1:j]: 18 i += 1 19 # 调整过指针后要将标记置否 20 flag = False 21 # 若j移动之后回文 22 elif s[i:j-1][::-1] == s[i:j-1]: 23 j -= 1 24 # 调整过指针后要将标记置否 25 flag = False 26 else: 27 return False 28 # 回文则正常移动指针 29 else: 30 i += 1 31 j -= 1 32 return True 33 34 if __name__ == '__main__': 35 solution = Solution() 36 print(solution.validPalindrome("eeccccbebaeeabebccceea"))