每日一道leetcode 最大括號深度

2021-10-11 19:34:53 字數 2112 閱讀 2167

有效括號字串 定義:對於每個左括號,都能找到與之對應的右括號,反之亦然。詳情參見題末「有效括號字串」部分。

巢狀深度 depth 定義:即有效括號字串巢狀的層數,depth(a) 表示有效括號字串 a 的巢狀深度。詳情參見題末「巢狀深度」部分。

有效括號字串型別與對應的巢狀深度計算方法如下圖所示:

給你乙個「有效括號字串」 seq,請你將其分成兩個不相交的有效括號字串,a 和 b,並使這兩個字串的深度最小。

不相交:每個 seq[i] 只能分給 a 和 b 二者中的乙個,不能既屬於 a 也屬於 b 。

a 或 b 中的元素在原字串中可以不連續。

a.length + b.length = seq.length

深度最小:max(depth(a), depth(b)) 的可能取值最小。

劃分方案用乙個長度為 seq.length 的答案陣列 answer 表示,編碼規則如下:

answer[i] = 0,seq[i] 分給 a 。

answer[i] = 1,seq[i] 分給 b 。

如果存在多個滿足要求的答案,只需返回其中任意 乙個 即可。

示例 1:

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

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

示例 2:

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

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

解釋:本示例答案不唯一。

按此輸出 a = 「()()」, b = 「()()」, max(depth(a), depth(b)) = 1,它們的深度最小。

像 [1,1,1,0,0,1,1,1],也是正確結果,其中 a = 「()()()」, b = 「()」, max(depth(a), depth(b)) = 1 。

1 < seq.size <= 10000

有效括號字串:

僅由 「(」 和 「)」 構成的字串,對於每個左括號,都能找到與之對應的右括號,反之亦然。

下述幾種情況同樣屬於有效括號字串:

空字串

連線,可以記作 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,而 「)(」 和 「(()」 都不是有效括號字串。

要求劃分出使得最大巢狀深度最小的分組,我們首先得知道如何計算巢狀深度。我們可以通過棧實現括號匹配來計算:

維護乙個棧 s,從左至右遍歷括號字串中的每乙個字元:

如果當前字元是 (,就把 ( 壓入棧中,此時這個 ( 的巢狀深度為棧的高度;

如果當前字元是 ),此時這個 ) 的巢狀深度為棧的高度,隨後再從棧中彈出乙個 (。

下面給出了括號序列 (()(())()) 在每乙個字元處的巢狀深度:

括號序列 ( ( ) ( ( ) ) ( ) )

下標編號 0 1 2 3 4 5 6 7 8 9

巢狀深度 1 2 2 2 3 3 2 2 2 1

知道如何計算巢狀深度,問題就很簡單了:只要在遍歷過程中,我們保證棧內一半的括號屬於序列 a,一半的括號屬於序列 b,那麼就能保證拆分後最大的巢狀深度最小,是當前最大巢狀深度的一半。要實現這樣的對半分配,我們只需要把奇數層的 ( 分配給 a,偶數層的 ( 分配給 b 即可。對於上面的例子,我們將巢狀深度為 1 和 3 的所有括號 (()) 分配給 a,巢狀深度為 2 的所有括號 ()()() 分配給 b。

此外,由於在這個問題中,棧中只會存放 (,因此我們不需要維護乙個真正的棧,只需要用乙個變數模擬記錄棧的大小。

class

solution

else

}return ans;

}}

Leetcode 每日一道

如果不出意外每天會寫一道演算法題的部落格。如果題目簡單,就一天發布一道。如果題目比較難。我會2 3天發一道演算法的題目。今天寫的這道題目比較簡單。題目如下 解法我是用c 寫的。我的解法的大致想法是 先把需要轉換的矩陣直接轉換成一維的陣列,然後再根據要求把一維中的元素全部截為以c個元素為一組的vect...

每日一道 LeetCode 12 最大子序和

每天 3 分鐘,走上演算法的逆襲之路。每日一道 leetcode 前文合集 github gitee 給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大...

每日一道 LeetCode 11 外觀數列

每天 3 分鐘,走上演算法的逆襲之路。每日一道 leetcode 前文合集 github gitee 給定乙個正整數 n 1 n 30 輸出外觀數列的第 n 項。注意 整數序列中的每一項將表示為乙個字串。外觀數列 是乙個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。前五項如下 1.1...