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

LeetCode 409: Longest Palindrome

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

基本資料
#

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

  • 提交紀錄:Wrong Answer ×4 → Accepted → Wrong Answer → Accepted

解題思路
#

回文兩邊對稱,所以每個字元最多用 v // 2 * 2 個(偶數)。奇數次的字元剩下的那一個,只有一個可以放在正中間:只要有任何奇數次,答案再加 1(Greedy,Hash Table 計數)。大小寫是不同的字元。

我的嘗試
#

2022 年錯了四次,都在處理奇數次的字元:

  • 第一版用 v / 2(浮點數),而且偶數次只加了一半:"aa" 回傳 1.0。
  • 第二版奇數次的字元只加 1,忽略了可以用掉的 v - 1 個:"bbb" 答案 3,回傳 1。
  • 第三版改成加 v - 1,但這時候忘了中間的 1:"bbb" 回傳 2;第四版又改成加 v 再加 1,變成 4。

2026 年重寫時邏輯對了,但寫成 return res + 1 if plus_one else 0,條件運算子的優先順序比 + 低,整句變成 (res + 1) if plus_one else 0,沒有奇數次時回傳 0:"aa" 回傳 0。

正確解法
#

class Solution:
    def longestPalindrome(self, s: str) -> int:
        cnt = Counter(s)
        res = sum(v // 2 * 2 for v in cnt.values())
        return res + (1 if any(v % 2 for v in cnt.values()) else 0)

複雜度
#

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

要特別避免的錯誤
#

  • 奇數次的字元也能用掉 v - 1 個,不是只能放一個在中間。
  • res + 1 if odd else 0 會被解讀成 (res + 1) if odd else 0,要加括號。
  • v / 2 是浮點數,要用 //。

面試口說整理
#

我數每個字元的次數,每個字元都取偶數個放在兩邊,只要有任何字元是奇數次,中間就能再多放一個。時間 O(n)。

相關文章

LeetCode 290: Word Pattern
·1 分鐘
LeetCode Easy Hash-Table String
LeetCode 290 解題筆記:pattern 的字元和單字要一對一對應,用兩個方向的 dict 或比較 set 大小
LeetCode 383: Ransom Note
·1 分鐘
LeetCode Easy Hash-Table String Counting
LeetCode 383 解題筆記:ransomNote 每個字元的需求數量都不能超過 magazine 的數量;Counter 相減為空就成立
LeetCode 387: First Unique Character in a String
·1 分鐘
LeetCode Easy Hash-Table String Queue Counting
LeetCode 387 解題筆記:先計數,再從左到右找第一個次數是 1 的字元
LeetCode 389: Find the Difference
·1 分鐘
LeetCode Easy Hash-Table String Bit-Manipulation Sorting
LeetCode 389 解題筆記:t 比 s 多一個字元,把兩個字串的所有字元 XOR 起來,成對的抵消,剩下的就是多的那個
LeetCode 242: Valid Anagram
·1 分鐘
LeetCode Easy Hash-Table String Sorting
LeetCode 242 解題筆記:兩個字串的字元次數完全相同就是 anagram,用 Counter 比較或排序後比較
LeetCode 205: Isomorphic Strings
·1 分鐘
LeetCode Easy Hash-Table String
LeetCode 205 解題筆記:兩個字串的字元要一對一對應,字元種類數和配對種類數都相同就成立