1111 有效括號的巢狀深度

2021-10-04 16:15:55 字數 1595 閱讀 3221

有效括號字串 僅由 「(」 和 「)」 構成,並符合下述幾個條件之一:

空字串

連線,可以記作 ab(a 與 b 連線),其中 a 和 b 都是有效括號字串

巢狀,可以記作 (a),其中 a 是有效括號字串

類似地,我們可以定義任意有效括號字串 s 的 巢狀深度 depth(s):

s 為空時,depth("") = 0

s 為 a 與 b 連線時,depth(a + b) = max(depth(a), depth(b)),其中 a 和 b 都是有效括號字串

s 為巢狀情況,depth("(" + a + 「)」) = 1 + depth(a),其中 a 是有效括號字串

例如:"","()()",和 「()(()())」 都是有效括號字串,巢狀深度分別為 0,1,2,而 「)(」 和 「(()」 都不是有效括號字串。

給你乙個有效括號字串 seq,將其分成兩個不相交的子串行 a 和 b,且 a 和 b 滿足有效括號字串的定義(注意:a.length + b.length = seq.length)。

現在,你需要從中選出 任意 一組有效括號字串 a 和 b,使 max(depth(a), depth(b)) 的可能取值最小。

返回長度為 seq.length 答案陣列 answer ,選擇 a 還是 b 的編碼規則是:如果 seq[i] 是 a 的一部分,那麼 answer[i] = 0。否則,answer[i] = 1。即便有多個滿足要求的答案存在,你也只需返回 乙個。

示例 1:

輸入:seq = 「(()())」

輸出:[0,1,1,1,1,0]

示例 2:

輸入:seq = 「()(())()」

輸出:[0,0,0,1,1,0,1,1]

1 <= text.size <= 10000

看題兩小時系列。有效括號字串 可以看有效的括號

有乙個有效的括號字串,有效的意思是每個左括號都有乙個右括號所對應,比如「()()」或「(())」之類的。有這個字串之後,抽出兩個字串,他們滿足 1.仍然是有效的括號字串。2.深度最低。

深度就是指巢狀的括號層數,比如「()」深度為1,「(())」深度為2,這道題不用算深度。

現在就圍繞有效和深度最低來想一種策略,因為每個左括號必有乙個右括號與之對應,此時遇到第乙個左括號,把它和它的右括號放到第乙個字串裡,然後遇到第二個左括號,把它和它對應的右括號放到第二個字串裡。直到所有括號都分配完了兩個字串就滿足上面的兩個要求。

如何進行分配呢,你可以畫幾個括號,起始座標用0表示,如果當前左括號index為偶數,那麼它對應的右括號為奇數,如果當前左括號index為奇數,它對應的右括號為偶數。因為一旦對應左括號的右括號出現了,那麼中間肯定有n對匹配的括號(n可以為0),這樣乙個數加偶數再加1奇偶肯定變化。

用乙個和括號字串等大的陣列,它的值為0或者1,表示當前括號被分給第乙個字串還是第二個字串。遍歷括號字串,左括號按照自身index的奇偶來分配到0或1,右括號和對應的左括號index奇偶顛倒,所以自身索引加1的奇偶性來分配到0或1。

class

solution

else

}return ans;}}

;

1111 有效括號的巢狀深度

有效括號字串 僅由 和 構成,並符合下述幾個條件之一 空字串 連線,可以記作 ab a 與 b 連線 其中 a 和 b 都是有效括號字串 巢狀,可以記作 a 其中 a 是有效括號字串 類似地,我們可以定義任意有效括號字串 s 的 巢狀深度 depth s s 為空時,depth 0 s 為 a 與 ...

1111 有效括號的巢狀深度

括號匹配的問題一般都是根據棧來實現的,棧內放入括號進行匹配。文中具體思路見leetcode解析。知道如何計算巢狀深度,問題就很簡單了 只要在遍歷過程中,我們保證棧內一半的括號屬於序列 a,一半的括號屬於序列 b,那麼就能保證拆分後最大的巢狀深度最小,是當前最大巢狀深度的一半。要實現這樣的對半分配,我...

棧 1111 有效括號的巢狀深度

思路 維護乙個棧s,從左至右遍歷括號字串中的每乙個字元 如果當前字元是 就把 壓入棧中,此時這個 的巢狀深度為棧的高度 如果當前字元是 此時這個 的巢狀深度為棧的高度,隨後再從棧中彈出乙個 下面給出了括號序列 在每乙個字元處的巢狀深度 括號序列 下標編號 0 1 2 3 4 5 6 7 8 9 巢狀...