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

LeetCode 2697: Lexicographically Smallest Palindrome

·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 第一次嘗試:2026-01-24

  • 提交紀錄:Accepted(一次通過)

解題思路
#

要用最少的修改次數把字串變成回文,次數相同時取字典序最小的。

回文的條件是每一對 (i, n - 1 - i) 都相等。對每一對:

  • 已經相等:不用改。
  • 不相等:最少要改一個,而改成比較小的那個字元,字典序最小。

每一對各自獨立,所以兩件事可以同時做到。

我的解法
#

class Solution:
    def makeSmallestPalindrome(self, s: str) -> str:
        chars = list(s)
        left, right = 0, len(chars) - 1
        while left < right:
            smaller = min(chars[left], chars[right])
            chars[left] = chars[right] = smaller
            left += 1
            right -= 1
        return "".join(chars)

原本的版本用 if / elif 分別處理「左邊比較小」和「右邊比較小」,這裡直接取 min。

複雜度
#

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

要特別避免的錯誤
#

  • 改成比較大的字元:修改次數一樣,但字典序變大。
  • 兩邊都改:只需要改比較大的那一邊。

面試口說整理
#

回文要求每一對對稱位置相等,所以我用對撞指針一對一對看:不同的話至少要改一個,改成比較小的那個字元,修改次數最少、字典序也最小。每一對互不影響,時間 O(n)。

相關文章

LeetCode 942: DI String Match
·1 分鐘
LeetCode Easy Array Two-Pointers String Greedy
LeetCode 942 解題筆記:兩個指標分別指向還沒用的最小值和最大值,遇到 I 放最小、遇到 D 放最大
LeetCode 680: Valid Palindrome II
·1 分鐘
LeetCode Easy Two-Pointers String Greedy
LeetCode 680 解題筆記:左右指針遇到第一對不同時,只有兩種刪法:刪左邊或刪右邊,檢查剩下的是否為回文
LeetCode 1616: Split Two Strings to Make Palindrome
·2 分鐘
LeetCode Medium Two-Pointers String Greedy
LeetCode 1616 解題筆記:外側用 a 的前綴配 b 的後綴貪心比對,配不下去時,剩下的中間段必須整段在 a 或 b 裡是回文;兩個方向都要檢查
LeetCode 3794: Reverse String Prefix
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 3794 解題筆記:切片一行解決;手寫雙指針時要先把字串轉成 list
LeetCode 3750: Minimum Number of Flips to Reverse Binary String
·1 分鐘
LeetCode Easy Two-Pointers Bit-Manipulation String
LeetCode 3750 解題筆記:把二進位字串跟它的反轉逐位比較,不同的位數就是答案
LeetCode 3545: Minimum Deletions for At Most K Distinct Characters
·1 分鐘
LeetCode Easy Greedy Hash-Table String Sorting Counting
LeetCode 3545 解題筆記:要減少種類就得整種刪掉,從出現次數最少的開始刪