验证回文字符串 Ⅱ(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)))

 

 

 

posted @ 2020-08-05 14:00  菠菜猫  阅读(286)  评论(0编辑  收藏  举报