有效括號字串 僅由 「(」 和 「)」 構成,並符合下述幾個條件之一:
空字串
連線,可以記作 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 巢狀...