解題說明
Search Suggestions System
題目描述:給定字串陣列 products 和搜尋字串 searchWord,在鍵入 searchWord 的每個前綴後,從 products 中找出最多三個字典序最小且以該前綴開頭的商品名稱。
解題思路:先將 products 排序。對 searchWord 的每個前綴(長度 1 到 m),用二分搜尋在已排序的 products 中找到第一個大於等於該前綴的位置,然後從該位置往後最多取三個具有正確前綴的商品。
排序後,所有以相同前綴開頭的商品必然連續排列,且字典序最小的排在前面。二分搜尋直接定位起始點,無需線性掃描整個陣列。此方法比 Trie 實作更簡潔,且在本題資料規模下效能足夠。
C++ 解法
複雜度分析
時間複雜度:O(n log n + m log n) — 排序 O(n log n);每個前綴二分搜尋 O(log n),共 m 個前綴;每次最多取 3 個結果,每次前綴比較 O(m),總計 O(m * (log n + 1)) = O(m log n)。
空間複雜度:O(m) — 結果陣列之外,每次只存當前前綴字串;Trie 版本則需 O(n * L) 額外空間。
虛擬碼
1. Sort products lexicographically 2. Initialize prefix = "", result = [] 3. For each character c in searchWord: a. prefix += c b. Use lower_bound to find first product >= prefix c. Collect up to 3 products that start with prefix d. Append collected suggestions to result 4. Return result
其他解法
Trie(字典樹):建立 Trie 並在每個節點儲存字典序最小的三個商品名稱。插入所有商品後,對每個前綴直接查詢對應節點取得建議。時間複雜度 O(nL + mL),L 為平均字串長度。記憶體使用較多但查詢固定 O(L)。
雙指標滑動視窗:排序後,維護左右指標圍住當前符合前綴的範圍,每次前綴延長時只需向內收縮左右邊界。無需重複二分搜尋,整體 O(n log n + m + n) 時間,是最優解。
延伸思考
- 如何用 Trie 實作並在每個節點維護字典序最小的前三個商品?
- 若搜尋需要支援模糊匹配(允許一個字元不同),解法應如何調整?
- 使用雙指標收縮視窗的方法,如何避免重複的二分搜尋?