[Leetcode解題] 1807. Evaluate the Bracket Pairs of a String
26 September 2026
medium
string
hashTable
1807. Evaluate the Bracket Pairs of a String
題目
1807. Evaluate the Bracket Pairs of a String
給定一個字串 s,其中包含若干個以括號括起來的鍵名 (key),以及一個二維字串陣列 knowledge,其中 knowledge[i] = [key_i, value_i] 代表 key_i 對應的值為 value_i。
請將字串 s 中所有括號 (key) 替換為 knowledge 中對應的 value。如果該 key 不存在於 knowledge 中,則將 (key) 替換為問號 '?'。最終回傳替換完成後的字串。
解題思路
本題要求解析字串中的括號配對 (key) 並將其替換為哈希對照表中的值,屬於哈希表(Hash Table)結合雙指針 / 字串掃描的經典應用。
1. 哈希表預處理
若每次搜尋 key 都對 knowledge 陣列進行線性搜尋,會導致整體時間複雜度居高不下。因此,我們在開始掃描字串前,先將 knowledge 轉換為字典(Hash Table / Map):
knowledge_mappings = dict(knowledge)
這樣每個 key 的查找與比對平均僅需 $O(1)$ 時間。
2. 雙指針 / 字串掃描
使用指針 start 遍歷字串 s:
- 一般字元:若
s[start] != '(',表示當前字元為普通字元,直接將s[start]放入答案列表ans中,並將start往後移動 1 格。 - 括號開頭:若
s[start] == '(',則使用另一個指針end從start + 1開始尋找對應的右括號')':- 擷取括號內的鍵名:
target = s[start+1:end] - 查詢
knowledge_mappings:- 若
target存在,將knowledge_mappings[target]加入ans。 - 若
target不存在,將'?'加入ans。
- 若
- 將
start移動至end + 1,繼續處理後續字元。
- 擷取括號內的鍵名:
3. 組合結果
最後使用 ''.join(ans) 將列表組合成最終字串並回傳。
Python 實作
class Solution:
def evaluate(self, s: str, knowledge: list[list[str]]) -> str:
knowledge_mappings = dict(knowledge)
start = 0
ans = []
while start < len(s):
if s[start] != '(':
ans.append(s[start])
start += 1
continue
end = start + 1
while s[end] != ')':
end += 1
target = s[start+1:end]
if target in knowledge_mappings:
ans.append(knowledge_mappings[target])
else:
ans.append('?')
start = end + 1
return ''.join(ans)
複雜度分析
- 時間複雜度:$O(N + M \cdot L)$
其中 $N = \text{len}(s)$,$M = \text{len}(knowledge)$,$L$ 為鍵值的平均長度。
- 將
knowledge轉為字典需要 $O(M \cdot L)$ 時間。 - 遍歷字串
s時,每個字元最多被start與end各訪問一次,屬於線性掃描 $O(N)$;哈希表查找與切片平均需 $O(L)$ 時間。 - 因此整體時間複雜度為 $O(N + M \cdot L)$。
- 將
- 空間複雜度:$O(N + M \cdot L)$
knowledge_mappings字典佔用 $O(M \cdot L)$ 空間,ans列表儲存結果字元佔用 $O(N)$ 空間。