每日一題,每日一練,17有效括號的嵌套深度(你以爲右括號是第一層,實際上是第二層,而棧在第五層)

  1. 有效括號的嵌套深度 有效括號字符串 僅由 “(” 和 “)” 構成,並符合下述幾個條件之一:

空字符串
連接,可以記作 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]

這題,呵,我讀了一小時題纔看明白==
翻譯一下:
有A和B兩個列表存在,我們要把每組有效括號放在相應的列表,在這個字符串中,如果把這個括號放進A,則標0,否則標1,(你反過來也是一樣的),對於該題的需求如下:每個括號對具有它的嵌套深度,即它是第幾層的括號如“((()))”嵌套深度爲123321,“(())()”爲122111,我們需要讓A裏的最大深度和B裏面的最大深度中兩個值中的最大值儘可能小(注意:這裏重新生成的A和b合成字符串輸出後所有括號的嵌套深度要重新計算)。返回對每個括號位置的存放結果。

那麼這樣題目變得簡單了許多,我們假想一個棧來存儲括號,左括號爲壓棧,右括號爲出棧(棧是在各種括號匹配題是用的最多的數據結構),之後運用平均的思想,如果四個盒子嵌套分成兩組,那麼肯定是平均兩個盒子能達到我們的需求,因此,我們遍歷字符串,如果是左括號,我們就壓棧,然後扔到左面裏面,並將下一層的左括號準備扔進另一邊,如果是右括號,我們就扔到這一層的深度和當層左括號結合,然後退棧,準備扔到另一邊,可以看出每當深度發生變化時,我們要扔括號的位置也就發生了變化,因此我們用深度mod 2 來表示我們要扔到哪邊,將深度平均分開,而對於棧整體,我們只用到了深度,所以我們只用一個指針q來記錄深度就行了,不用實際創建一個棧

class Solution:
    def maxDepthAfterSplit(self, seq: str) -> List[int]:
        if(seq==" "):
            return 0
        q=-1#意味着棧什麼都沒有,本題也可以用0來表示深度爲0,不過是先扔到哪的區別
        end=[]
        for i in seq:
            if(i=="("):
                q=q+1
                end.append(q%2)
            elif(i==")"):
                end.append(q%2)
                q=q-1
        return end

這鉢啊,這鉢是因爲你不會,所以你纔會,這句話是個哲學

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章