leetcode1111. 有效括號的嵌套深度

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
思路:參考解答區大神甜姨的解答
題目最後 answer 的意思就是,爲 0 的部分對應 seq 的括號是 A 字符串,爲 1 的部分對應 seq 的括號是 B 字符串。
示例 1:
輸入:seq = “(()())”
輸出:[0,1,1,1,1,0]
answer 的意思是下面這個樣子。紅色部分是 A 串,藍色部分是 B 串。在這裏插入圖片描述
示例 2:
輸入:seq = “()(())()”
輸出:[0,0,0,1,1,0,1,1]
對應的 answer 的圖示:
在這裏插入圖片描述
題面也說了 answer 的答案是不唯一的,下面這樣也是可以的:
在這裏插入圖片描述
下面說做法:
我假設你已經做過上面的題目了(有效的括號),知道需要用棧輔助判斷。題面中的 depth 其實就是棧的最大深度。“你需要從中選出任意一組有效括號字符串 A 和 B,使 max(depth(A), depth(B)) 的可能取值最小”。這句話其實相當於讓 A 字符串和 B 字符串的 depth 儘可能的接近。爲什麼呢?因爲 seq 對應的棧上,每個左括號都對應一個深度,而這個左括號,要麼是 A 的,要麼是 B 的。所以,棧上的左括號只要按奇偶分配給A和B就可以啦!時間複雜度很明顯是 O(n) 的,空間複雜度也是 O(n)(如果算返回的變量的話)。

簡言之:遍歷字符串,遇到左括號,如果下標位置是偶數,歸爲0,即A組,下標位置爲奇數,歸爲1,即B組;遇到右括號,則相反(因爲一對有效的括號不可能同時出現在奇數位置或偶數位置上)

代碼:

class Solution:
    def maxDepthAfterSplit(self, seq: str) -> List[int]:
        ans = [0] * len(seq)
        for i in range(len(seq)):
            if seq[i] == '(':   #遇到左括號
                ans[i] = i & 1  #利用位運算判斷奇偶性
            else:               #遇到右括號
                ans[i] = (i + 1) & 1   #相反的位運算判斷,+1就行
        return ans

附:這裏利用了位運算判斷數字的奇偶性,原理在於二進制中高位數字均爲2的冪次方,只有最低位的數字決定了該數的奇偶性,是0爲偶數,是1爲奇數,所以每次都和1做與運算就可以求出最後一位與1運算的結果,以此來判斷奇偶
此處參考:位運算判斷一個數爲奇偶數

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