验证回文字符串 Ⅱ(python3)
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: "aba"
输出: True
示例 2:
输入: "abca"
输出: True
解释: 你可以删除c字符。
注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome-ii
代码实现:
难点分析:解题思路是使用双指针,分别从字符串两端进行比较。
1.遇到本身就是回文字符串,使用字符串翻转进行比较。
2.若本身不是回文字符串,则从字符串两端进行比较。如果遇到s[i] != s[j], 那么可以删除一个字符(分情况讨论,删除左边或右边),再次进行比较。
其中有一部分比较难懂,就是第20行,利用切片生成子字符串,判断其是否回文字符串。(理解过程中需要注意切片规则,右边是开区间)
1 class Solution(object): 2 def validPalindrome(self, s): 3 """ 4 :type s: str 5 :rtype: bool 6 """ 7 # s = list(s) 8 # r = ''.join(reversed(s)) 9 # print(r) 10 11 r = s[::-1] #字符串翻转 12 print (r) 13 if s == r: 14 return True 15 16 i = 0 17 j = len(s)-1 18 while i<=j: 19 if s[i]!=s[j]:## 由于这样切片s[i+1:j+1]在j=len(s)-1时会出错,改为s[i+1:j]+s[j] 20 return s[i:j] == r[i+1:j]+r[j] or s[i+1:j]+s[j]== r[i:j] 21 i += 1 22 j -= 1
字符串翻转有两种方式:(方法1 比方法2的执行时间快,差距如下图)
1.使用字符串切片
str='Runoob' print(str[::-1])
2.使用 reversed()
str='Runoob'
print(''.join(reversed(str)))