[LeetCode] 1111、有效括號的嵌套深度

題目描述

有效括號字符串類型與對應的嵌套深度計算方法如下圖所示:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-c4fYY5Bf-1585896899092)(./imgs/20200402183743.jpg)]
給你一個「有效括號字符串」 seq,請你將其分成兩個不相交的有效括號字符串,AB,並使這兩個字符串的深度最小。

  • 不相交:每個 seq[i] 只能分給 AB 二者中的一個,不能既屬於 A 也屬於 B
  • AB 中的元素在原字符串中可以不連續
  • A.length + B.length = seq.length
  • 深度最小:max(depth(A), depth(B)) 的可能取值最小。

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

輸入:seq = "()(())()"    // 0表示分割A,1表示分給B
輸出:[0,0,0,1,1,0,1,1]
解釋:本示例答案不唯一。

解題思路

本題其實相當於讓 A 字符串和 B 字符串的 depth 儘可能的接近。爲什麼呢?因爲 seq 對應的棧上,每個左括號都對應一個深度,而這個左括號,要麼是 A 的,要麼是 B 的。所以,棧上的左括號只要按奇偶分配AB 就可以啦!

更好理解的思路:啥奇偶規律啊?我咋就沒看出來有這規律呢?別慌,我幫你捋捋更簡單實惠的理解方法。

這題是這樣的,要讓AB的最大深度最小,關鍵就是,A\B你倆的深度誰都別漲太快。別A的深度都到10了,B0深度呢。所以很簡單,漲深度的時候,誰比較淺,我就給誰漲。降的時候,誰比較深,我就給誰降。

啥叫“漲深度”呢?那就是'('啊,來一個左括號,那深度就漲一格,所以A/B誰淺就給誰漲。深度一樣的話呢,就隨便給漲一個。漲完了你得降啊,啥叫“降深度”呢?那就是右括號啊,右括號來了誰深先降誰。

我的實現

class Solution {
public:
    vector<int> maxDepthAfterSplit(string seq) {
        int length = seq.size();
        vector<int> ans(length, 0);
        int a = 0, b = 0;
        for(int i = 0; i < length; i++){
            char c = seq[i];
            if(c == '('){
                if(a < b){
                    a++;
                    ans[i] = 0;
                }else{
                    b++;
                    ans[i] = 1;
                }
            }else if(c == ')'){
                if(a > b){
                    a--;
                    ans[i] = 0;
                }else{
                    b--;
                    ans[i] = 1;
                }
            }
        }
        
        return ans;
    }
    
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章