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

LeetCode 522: Longest Uncommon Subsequence II

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

基本資料
#

難易度: medium 第一次嘗試:2026-04-05

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

解題思路
#

關鍵觀察:如果某個字串的子序列是「特殊」的(不是其他任何字串的子序列),那這個字串本身也是特殊的。 子序列能放進別的字串,它的母字串不一定能;反過來,母字串若能放進別的字串,它所有子序列也都能。所以只需要檢查每個完整字串。

strs[i] 是特殊的條件:對所有 j != i,strs[i] 都不是 strs[j] 的子序列。

  • 比 strs[i] 短的字串不可能包含它,不用檢查。
  • 依長度由長到短排序,第一個符合條件的就是答案;都不符合回傳 -1。

判斷子序列用同向雙指針:i 走短字串、j 走長字串,字元相同 i 才前進,j 每步都前進,最後看 i 有沒有走完。

我的解法
#

class Solution:
    def findLUSlength(self, strs: List[str]) -> int:
        def is_subsequence(s: str, t: str) -> bool:    # s 是不是 t 的子序列
            i = 0
            for ch in t:
                if i < len(s) and s[i] == ch:
                    i += 1
            return i == len(s)

        strs.sort(key=len, reverse=True)
        n = len(strs)
        for i in range(n):
            uncommon = True
            for j in range(n):
                if len(strs[j]) < len(strs[i]):
                    break                              # 後面都更短,不可能包含 strs[i]
                if i != j and is_subsequence(strs[i], strs[j]):
                    uncommon = False
                    break
            if uncommon:
                return len(strs[i])
        return -1

重複的字串會互相是子序列,所以自然被排除,不需要特別處理。

複雜度
#

時間 O(n^2 · L),L 是字串長度;空間 O(1)(排序除外)。

要特別避免的錯誤
#

  • 去列舉每個字串的所有子序列:指數級。
  • 只跟比自己長的字串比:一樣長、內容相同的字串也要比。

面試口說整理
#

如果某個子序列是特殊的,包含它的完整字串也一定是特殊的,所以答案一定是某個完整字串的長度。我把字串依長度由長到短排序,檢查每個字串是不是其他長度不小於它的字串的子序列,用雙指針判斷;第一個不是的就是答案,都是就回傳 -1。時間 O(n^2 · L)。

相關文章

LeetCode 244: Shortest Word Distance II
·1 分鐘
LeetCode Medium Two-Pointers Design Hash-Table String Array
LeetCode 244 解題筆記:預處理每個字的出現位置(天然排序),查詢時對兩個位置列表做雙指針合併,每次移動比較小的那個
LeetCode 923: 3Sum With Multiplicity
·3 分鐘
LeetCode Medium Two-Pointers Sorting Hash-Table Counting Array
LeetCode 923 解題筆記:排序後固定第一個數、對撞指針找另外兩個;兩端值相同時用組合數一次算完,不同時把兩端各自的重複數相乘
LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram
LeetCode 3555: Smallest Subarray to Sort in Every Sliding Window
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array Monotonic-Stack
LeetCode 3555 解題筆記:每個長度 k 的視窗都是一次 LeetCode 581;n 只有 1000,對每個視窗跑 O(k) 的兩次掃描即可
LeetCode 581: Shortest Unsorted Continuous Subarray
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array Monotonic-Stack
LeetCode 581 解題筆記:從左往右記最大值,最後一個比最大值小的位置是右界;從右往左記最小值,最後一個比最小值大的位置是左界
LeetCode 1877: Minimize Maximum Pair Sum in Array
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 1877 解題筆記:排序後最小配最大、次小配次大,對撞指針取配對和的最大值