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

LeetCode 244: Shortest Word Distance II

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

基本資料
#

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

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

解題思路
#

查詢會很多次,所以初始化時先用雜湊表記下每個字出現的所有位置。依序掃過陣列建表,每個列表天然是排序好的。

查詢 word1、word2 時,問題變成:兩個排序列表 a、b,找 |a[i] - b[j]| 的最小值。用雙指針:

  • 比較 a[i]、b[j],更新答案。
  • 移動比較小的那個:比較小的那個跟 b(或 a)後面的元素只會更遠,不用再看。

我的嘗試
#

我 AC 的版本是對兩個位置列表做雙層迴圈,每次查詢 O(|a| · |b|)。如果某個字出現很多次、查詢又很多,會很慢。改成雙指針後每次查詢是 O(|a| + |b|)。

正確解法
#

class WordDistance:
    def __init__(self, wordsDict: List[str]):
        self.pos = defaultdict(list)
        for i, word in enumerate(wordsDict):
            self.pos[word].append(i)               # 依序加入,天然排序

    def shortest(self, word1: str, word2: str) -> int:
        a, b = self.pos[word1], self.pos[word2]
        i = j = 0
        best = float("inf")
        while i < len(a) and j < len(b):
            best = min(best, abs(a[i] - b[j]))
            if a[i] < b[j]:
                i += 1                             # a[i] 跟 b 後面的只會更遠
            else:
                j += 1
        return best

複雜度
#

初始化 O(n),每次查詢 O(|a| + |b|),空間 O(n)。

要特別避免的錯誤
#

  • 每次查詢都重新掃整個陣列:沒用到「查詢很多次」這個條件。
  • 雙層迴圈比較所有位置配對:O(|a| · |b|)。

面試口說整理
#

我在初始化時用雜湊表記下每個字的所有位置,因為是依序加入,列表本身就是排序的。查詢時對兩個列表做雙指針,更新差的最小值後,移動數值比較小的那個指針,因為它跟另一個列表後面的元素只會更遠。每次查詢 O(|a| + |b|)。

相關文章

LeetCode 809: Expressive Words
·2 分鐘
LeetCode Medium Two-Pointers String Array
LeetCode 809 解題筆記:兩個指針一段一段比對連續相同字元的長度;長度不同時,s 的那段必須至少 3 個且不少於 word;最後兩個字串都要剛好走完
LeetCode 923: 3Sum With Multiplicity
·3 分鐘
LeetCode Medium Two-Pointers Sorting Hash-Table Counting Array
LeetCode 923 解題筆記:排序後固定第一個數、對撞指針找另外兩個;兩端值相同時用組合數一次算完,不同時把兩端各自的重複數相乘
LeetCode 208: Implement Trie (Prefix Tree)
·1 分鐘
LeetCode Medium Hash-Table String Design Trie
LeetCode 208 解題筆記:每個節點是 children 字典加一個 is_end 標記;insert、search、startsWith 都是沿著字元往下走
LeetCode 981: Time Based Key-Value Store
·2 分鐘
LeetCode Medium Hash-Table String Binary-Search Design
LeetCode 981 解題筆記:每個 key 存一個 (timestamp, value) 的 list,timestamp 是遞增的;get 時二分找最後一個 timestamp <= 查詢時間的
LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram
LeetCode 2337: Move Pieces to Obtain a String
·1 分鐘
LeetCode Medium Two-Pointers String
LeetCode 2337 解題筆記:跳過空格後兩邊的棋子順序必須一樣;L 只能往左、R 只能往右,所以每顆 L 在 start 的位置要 >= target,R 要 <=