ETH官方钱包

前往
大廳
主題

LeetCode - 1963. Minimum Number of Swaps to Make the String Balanced 解題心得

Not In My Back Yard | 2022-01-12 00:00:01 | 巴幣 2 | 人氣 216

題目連結(jié):


題目意譯:
你被給定一個(gè)索引值從 0 開始的、偶數(shù)長度 n 之字串 s。字串由恰好 n ÷ 2 個(gè) n ÷ 2 個(gè)開括號(hào) '[' 以及 n ÷ 2 個(gè)閉括號(hào) ']'。

一個(gè)字串會(huì)被稱為平衡的若且唯若:
其為空字串,或
它可被表為 AB,其中 A 和 B 皆為平衡字串,或
它可被表為 [C],其中 C 為平衡字串。

你可以無限次地交換任兩個(gè)索引值之括號(hào)。

回傳使 s 變?yōu)槠胶庾钌偎杞粨Q次數(shù)。

限制:
n == s.length
2 ≦ n ≦ 10 ^ 6
n 為偶數(shù)。
s[i] 只會(huì)是 '[' 或 ']'。
開括號(hào) '[' 的數(shù)量等於 n ÷ 2 ,且閉括號(hào) ']' 的數(shù)量等於 n ÷ 2。



範(fàn)例測資:
範(fàn)例 1:
輸入: s = "][]["
輸出: 1
解釋: 你可以藉由交換索引值 0 和索引值 3 使字串平衡。
結(jié)果字串為 "[[]]"。

範(fàn)例 2:
輸入: s = "]]][[["
輸出: 2
解釋: 你可以藉由以下步驟來使字串平衡:
- 交換索引值 0 和索引值 4。s = "[]][[]"。
- 交換索引值 1 和索引值 5。s = "[[][]]"。
結(jié)果字串為 "[[][]]"。

範(fàn)例 3:
輸入: s = "[]"
輸出: 0
解釋: 字串已經(jīng)平衡了。


解題思維:
首先按照一般檢查括號(hào)是否匹配(即本題的「平衡」)之作法,如這題,然後看其有多「不平衡」。

例如 "[]][]]][[[" 可以看到會(huì)有三個(gè) ']' 、 三個(gè) '[' 沒有被配對(duì)到。因此將其餘有匹配的括號(hào)移除後(可以移除是因?yàn)樗鼈兊拇嬖谂c否或是放在何處實(shí)質(zhì)上都不影響平衡性),字串便成為了完全不平衡的 "]]][[["。

而所有的字串都可以化簡成空字串或是完全不平衡的字串。一旦有了像是 "]]][[[" 這種字串之後,我們可以看到一次交換的操作最多可以得到兩組平衡的括號(hào) "[]"。例如說你可以將 "]]][[[" 頭尾的字元交換,得到 "[]][[]",把配對(duì)後的括號(hào)消除後得到 "]["。再做一次交換便可以得到 "[]"。

所以如果我們有 X 個(gè) ']' 需要配對(duì),則我們最少只需
ceil(X ÷ 2)
次交換即可將所有括號(hào)配對(duì)完成,即將字串 s 平衡了。其中 ceil 為上高斯函數(shù)(即向上取整。對(duì)於正數(shù)來說等價(jià)於無條件進(jìn)位)。




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

創(chuàng)作回應(yīng)

???\~O_O~/???
筆誤了
是ceil(X ÷ 2)
2022-01-13 06:59:23
Not In My Back Yard
感謝糾正。
2022-01-13 19:18:26
追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

更多創(chuàng)作