↓快轉到主要內容
  1. LeetCode/

LeetCode 680: Valid Palindrome II

·1 分鐘· ·
LeetCode Easy Two-Pointers String Greedy
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-08-30

  • 提交紀錄:Wrong Answer ×7 → Runtime Error ×2 → Time Limit Exceeded → Runtime Error ×3 → Wrong Answer → Runtime Error → Wrong Answer ×3 → Runtime Error → Wrong Answer → Accepted ×2

解題思路
#

左右指針往中間比(Two Pointers 模板一)。遇到第一對不同的 s[l] != s[r],最多只能刪一個,所以只有兩種可能:刪掉 s[l](檢查 s[l+1..r])或刪掉 s[r](檢查 s[l..r-1]),任一個是回文就成立。之前比過的部分已經對稱,不用再檢查。

我的嘗試
#

這題提交了 22 次,前面幾版的思路是「數有幾對不同,超過一對就失敗」:但刪掉一個字元後,後面的配對會整個錯開,不能只數。例如 "bca":只有一對不同(b 和 a),但刪哪一個都不是回文,答案 False,這幾版回傳 True。另外第一版還把 index 拿來比而不是字元。

正確解法
#

class Solution:
    def validPalindrome(self, s: str) -> bool:
        def pal(l, r):
            while l < r:
                if s[l] != s[r]:
                    return False
                l, r = l + 1, r - 1
            return True
        l, r = 0, len(s) - 1
        while l < r:
            if s[l] != s[r]:
                return pal(l + 1, r) or pal(l, r - 1)
            l, r = l + 1, r - 1
        return True

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 不能只數「有幾對不同」:刪掉一個字元之後,後面的配對位置會整個錯開。

面試口說整理
#

左右指針往中間比,遇到第一對不同時只有刪左邊或刪右邊兩種選擇,我分別檢查剩下的區間是不是回文。時間 O(n)、空間 O(1)。

相關文章

LeetCode 696: Count Binary Substrings
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 696 解題筆記:把字串切成連續相同字元的段,相鄰兩段可以組出 min(前一段, 這一段) 個子字串
LeetCode 541: Reverse String II
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 541 解題筆記:每 2k 個為一段,反轉每段的前 k 個;最後一段不足 k 個時全部反轉,切片會自動處理
LeetCode 455: Assign Cookies
·1 分鐘
LeetCode Easy Array Two-Pointers Greedy Sorting
LeetCode 455 解題筆記:小孩和餅乾都排序,用最小的、夠大的餅乾滿足最小的小孩;兩個指標各走一次
LeetCode 344: Reverse String
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 344 解題筆記:左右指針交換後往中間走,原地反轉
LeetCode 392: Is Subsequence
·1 分鐘
LeetCode Easy Two-Pointers String Dynamic-Programming
LeetCode 392 解題筆記:兩個指針,t 的指針一直往前,對上 s 的字元時 s 的指針也前進;兩邊的邊界都要檢查
LeetCode 409: Longest Palindrome
·1 分鐘
LeetCode Easy Hash-Table String Greedy
LeetCode 409 解題筆記:每個字元取偶數個放兩邊,只要有任何奇數次的字元,中間還能再放一個