给定一个非空字符串 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"))