力扣1111.有效括號的嵌套深度

解題思路

image.png

題目鏈接
https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/
這道題其實實現起來並不難,關鍵是要理解題意。其實我也理解了題意,但是沒有想到合適的方法。
首先,將題目總結下:
1.字符串一定是有效的,意味着字符串是成雙成對的(這個我想到了)
2.需要分成不相交的有效括號字符。這個不相交我迷惑了一下,開始是以爲只能是如[0,0,1,1,1,1]這樣的,就是說A在一邊,B在另外一邊,但是看例子顯然不是這樣。
3.要求字符串的深度最小。

第3個要求我開始根本沒考慮,我考慮的是這道題的考點。要求分爲A,B兩個有效括號,那麼就應該是一個入棧出棧的問題,保證配對就可以了。
因此,本題的難點是如何將配對和深度同時考慮。

深度最小的含義是什麼?觀察深度的定義方法,是嵌套的層數。也即是需要將嵌套的層數變的最小。然後看輸出知道A和B可以離散地分佈在任何地方(保證有效性即可),如果讓A和B的層數一直保持着較低的層數,那麼最好的方式就是兩個深度幾乎保持一致,因爲深度總是那麼深,如果AB深度接近,總體深度就比較低了。

那麼可以有這樣的思路

對應的代碼如下:

class Solution {
public:
    vector<int> maxDepthAfterSplit(string seq) {
        int deepa=1;
        int deepb=0;
        vector<int> vec(seq.size(),1);
        for(int i=1;i<seq.size();i++)
        {
            if(seq[i]=='(')
            {
                if(deepa>deepb){vec[i]=0;deepb++;}
                else{deepa++;}
            }else
            {
                if(deepa<deepb){vec[i]=0;deepb--;}
                else{deepa--;}
            }
        }
    return vec;}
};

這也是最原始的思路的實現。這樣的代碼和清晰,但是這裏定義了兩個深度的變量。於是,思考一下可不可以只用一個深度來解決這個問題。題中說了答案並不唯一,即我們所求答案是所有答案的一個子集。我們可以這樣規定,只要是奇數的加深度的動作,都置爲A,只要是奇數的減去深度的動作我們都置爲B;只要是偶數的加深度的動作,都置爲B,只要是偶數的減去深度的動作都置爲A。
在這樣的思路下,可以寫出最終的解。
再次強調,我們的答案是所有答案的一個子集。

最終代碼

class Solution {
public:
    vector<int> maxDepthAfterSplit(string seq) {
        int deep=0;
        vector<int> vec;
        for(auto ch:seq)
        {
            if(ch=='(')
            {deep++;
                if(deep%2)vec.push_back(1);
                else
                vec.push_back(0);
            }
            else{
                deep--;
                if(deep%2)vec.push_back(0);
                else vec.push_back(1);
            }
        }
    return vec;}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章