给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: “aba”
输出: True
示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。
注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
思路1:
最直接思路,直接比较字符串在-1步长处理后是否和原字符串相等,若不是,则逐一删除一个字符,判断其是否回文。
此思路在Python下无法处理超长字符串。
代码1:
class Solution:
def judge(self,s):
return True if s==s[::-1] else False
def validPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
if s=='':
return False
if self.judge(s):
return True
for i in range(len(s)):
if self.judge(s[:i]+s[i+1:]):
return True
思路2:
使用双指针技术。若是一个长度为n的字符串回文,则总计判断次数为(n+1)//2-1,据此使用双指针判断判断次数。若本字符串不是回文,则有两种选择,一是跳过第i个继续比较,二是跳过n-1-i个继续比较。
代码2:
class Solution:
def validPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
n=len(s)
cmptime=(n+1)//2-1
i=0
while i<cmptime and s[i]==s[n-1-i]:
i+=1
if i==cmptime:
return True
if s[i]==s[n-1-i-1]:
while i<cmptime and s[i]==s[n-1-i-1]:
i+=1
if s[i+1]==s[n-1-i]:
while i<cmptime and s[i+1]==s[n-1-i]:
i+=1
if i==cmptime:
return True
return False
分析2:
相对于思路一,每个字符串只需要被扫描一次。
时间复杂度O(n),空间复杂度O(1)