1 題目
給定一個非空字符串 s,最多刪除一個字符。判斷是否能成爲迴文字符串。
2 示例
示例 1:
輸入: “aba”
輸出: True
示例 2:
輸入: “abca”
輸出: True
解釋: 你可以刪除c字符
3 思路
用一左一右的雙指針,當左右指針的字符不相同時,若刪除當前左指針(或刪除右指針)的字符後的字符串是迴文字符串則返回True,否則返回Fasle。關於刪除左(右)指針後的判斷,可單獨定義一個方法。
4 題解
class Solution:
def validPalindrome(self, s):
l = 0
r = len(s)-1
while l < r:
if s[l] != s[r]:
return self.isPalindrome(s, l+1, r) or self.isPalindrome(s, l, r-1)
l += 1
r -= 1
return True
def isPalindrome(self, s, l, r): # 判斷是否爲迴文字符串
while l < r:
if s[l] != s[r]:
return False
l += 1
r -= 1
return True
5 改進
由於python可直接通過 s == s[::-1] 來判斷是否爲迴文字符串,故可以改進以上代碼
class Solution:
def validPalindrome(self, s):
l = 0
r = len(s)-1
while l < r:
if s[l] != s[r]:
sl = s[:l] + s[l+1:] # 去掉s[l]後的字符串
sr = s[:r] + s[r+1:] # 去掉s[r]後的字符串
return sl == sl[::-1] or sr == sr[::-1]
l += 1
r -= 1
return True
6 注意
學會在類中調用其他方法,不要遺漏while循環中變量的增減