LeetCode.680. 驗證迴文字串 Ⅱ
阿新 • • 發佈:2018-12-12
給定一個非空字串 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)