ETH官方钱包

前往
大廳
主題

LeetCode - 1807. Evaluate the Bracket Pairs of a String 解題心得

Not In My Back Yard | 2024-02-14 12:00:11 | 巴幣 0 | 人氣 106

題目連結:


題目意譯:
你被給定一字串 s,其包含著若干對括號,而每一對括號包含著一個非空的鍵值。

例如,在字串 "(name)is(age)yearsold" 裡面有兩對括號包含著 "name" 和 "age" 之鍵值。

你知道某些鍵值的數值。而這以一個二維字串陣列 knowledge 所表示,其中每一個 knowledge[i] = [keyi, valuei] 代表著 keyi 這個鍵值有著數值 valuei。

你被要求來為所有括號對「賦值」。在你為一對括號賦值的過程中,其包含著某個鍵值 keyi,你將會:
    將該括號對的鍵值 keyi 和括號本身替換成該鍵值對應的數值、
    如果你不知道該鍵值的數值,則你將會把 keyi 和括號替換成一個問號 "?"(不含引號)。

每一個鍵值最多出現在你的 knowledge 裡面一次。並且 s 不包含任何巢狀括號。

回傳把每一對括號求完值之後的結果字串。

限制:
1 ≦ s.length ≦ 10 ^ 5
0 ≦ knowledge.length ≦ 10 ^ 5
knowledge[i].length == 2
1 ≦ keyi.length, valuei.length ≦ 10
s 由小寫英文字母以及小括號 '(' 和 ')' 所組成。
s 中每一個左括號 '(' 必定會有其對應的一個右括號 ')'。
s 中每一對括號的鍵值必定非空。
s 中必定不會有巢狀括號。
keyi 和 valuei 由小寫英文字母所組成。
knowledge 中每一個 keyi 彼此相異。



範例測資:
範例 1:
輸入: s = "(name)is(age)yearsold", knowledge = [["name","bob"],["age","two"]]
輸出: "bobistwoyearsold"
解釋:
鍵值 "name" 有著數值 "bob",因此將 "(name)" 替換成 "bob"。
鍵值 "age" 有著數值 "two",因此將 "(age)" 替換成 "two"。

範例 2:
輸入: s = "hi(name)", knowledge = [["a","b"]]
輸出: "hi?"
解釋: 由於你不知道鍵值 "name" 的數值,你將會把 "(name)" 替換成 "?"。

範例 3:
輸入: s = "(a)(a)(a)aaa", knowledge = [["a","yes"]]
輸出: "yesyesyesaaa"
解釋: 相同的鍵值可以在 s 中出現多次。
鍵值 "a" 有著數值 "yes",因此將所有的 "(a)" 替換成 "yes"。
注意到那些沒有包在括號裡的 "a" 是不會被賦值的。


解題思維:
先掃過一次 knowledge,把鍵值與數值的關係用雜湊表(Hash Table)儲存起來,以便快速查詢某個鍵值其對應的數值為何。

接著就單純地掃過一次 s。找到每一個配對在一起的左右括號,把中間的字串擷取出來丟進雜湊表查詢來是否有對應的數值。如果有則把該字串以及括號替換成找到的數值,並塞進一個新的字串 R 的結尾中(因為直接修改 s 會很慢,你可能會需要把後面的字元往前移);反之,則將括號和字串替換成一個 "?",一樣,丟進 R 的結尾中。而除了括號與括號中間的字串以外,其餘字元應直接丟到 R 的結尾。

最後掃完之後,R 即是所求的結果字串。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作