1. 程式人生 > >LeetCode.680. 驗證迴文字串 Ⅱ

LeetCode.680. 驗證迴文字串 Ⅱ

給定一個非空字串 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)