解題思路
題目鏈接
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;}
};