今天的leetcode每日一題是1111. 有效括號的巢狀深度。不用看題目,只看標題我們就能拆出幾個問題來。
1 什麼是有效括號?
2 有效括號如何巢狀?
而括號類題目大部分同學可能在學習棧這一資料結構的時候做過。本文就來按照拆出來的兩個問題,系列解讀括號題。
給定乙個只包括 『(』,』)』,』』,』[』,』]』 的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
解題思路
前面我們也提到過了學習資料結構棧的時候的配套例題就是有效括號。使用棧結構時,每次遇到開符號,也就是(,[,時,將棧頂元素彈出比對。
go版本**
時間複雜度:o(n)
空間複雜度:o(n)
執行用時:0 ms
記憶體消耗:2 mb
func
isvalid
(s string
)bool
if s[0]
==')'
|| s[0]
==']'
||s[0]
=='}'
var c [
]byte
//切片當作棧
symbol :=
map[
byte
]byte':
'for
_,value :=
range s }}
c =(c,byte
(value)
)//入棧
}return
len(c)==0
}
有效括號字串 僅由 「(」 和 「)」 構成,並符合下述幾個條件之一:
空字串
連線,可以記作 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
解題思路
相信有了有效括號題目的鋪墊,大家應該能較快讀懂題目了。在有效括號的基礎上,本題增加了巢狀深度這一條件。除了棧這種解題方式,官方題解還很優秀地提供了找規律的解法,推薦大家去看看。
使用棧來解題
下圖是從官方題解中找來的,由於本題想要將有效括號串拆分成兩個子有效括號串,並且使 max(depth(a), depth(b)) 的可能取值最小,也就是想要兩個子串的巢狀深度盡可能相等。
思路是那就把巢狀深度對半分,a串佔據巢狀深度為奇數的,b串佔據巢狀深度為偶數的。
括號序列 (()
(())
())下標編號 0 1 2 3 4 5 6 7 8 9
巢狀深度 1 2 2 2 3 3 2 2 2 1
時間複雜度:o(n)
空間複雜度:o(1)
執行用時:0 ms
記憶體消耗:3.7 mb
func maxdepthaftersplit(seq string)
int ifv
==')'
}return ans
}
使用找規律方法解題括號序列 (()
(())
())下標編號 0 1 2 3 4 5 6 7 8 9
巢狀深度 1 2 2 2 3 3 2 2 2 1
還是這個圖,觀察找規律。
左括號 ( 的下標編號與巢狀深度的奇偶性相反
右括號 ) 的下標編號與巢狀深度的奇偶性相同
策略是:
規律證明:
對於任意乙個左括號,下標為x,它之前的左括號有l個,之前的右括號有r個。
那麼
x = l+r //下標編號從0開始
巢狀深度y為
y = l-r+1
由於l+r 和l-r奇偶相同,所以下標x和巢狀深度y奇偶相反。
同理可證右括號的下標和巢狀深度奇偶相同。
時間複雜度:o(n)
空間複雜度:o(1)
執行用時:0 ms
記憶體消耗:3.7 mb
func
maxdepthaftersplit
(seq string)[
]int
else
}return ans
}
有效括號的兩題做下來有了程式設計中模組化的思想了。將有效括號的判定變成乙個模組,在有了巢狀深度這一新的場景時,可以復用模組+新場景的判斷即可。 leetcode 有效的括號
題目 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 1.左括號必須用相同型別的右括號閉合。2.左括號必須以正確的順序閉合。示例1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 true includ...
leetcode 有效的括號
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 tr...
LeetCode 最長有效括號
方法一 方法二 給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2 解釋 最長有效括號子串為 示例 2 輸入 輸出 4 解釋 最長有效括號子串為 有效的括號 括號的生成 出棧入棧方法 參考之前的有效括號題目,當 前乙個為 則刪除這對,當全部刪除則為有效括號。在棧...