思路: 是否合法,最簡單判斷方法是用棧。只有一種括號,棧中存放元素只需要左括號的下標。 每一次遇到),就把棧頂的乙個左括號下標和當前下標一起壓入vector中,將這個vector排序,就是所有合法子串的下標。遍歷這個vector,找連續的最長值就可以。排序複雜度o(nlogn),除此之外遍歷一次字串,一次vector,o(n)。
int longestvalidparentheses(strings) }
}if(index.size()==0) return0;
sort(index.begin(),index.end());
int now=0
;
for(int i=0;i1;i++)
}now++;
longest=max(longest,now);
return
longest;
}
改良的stack解法:在想出上面解法的過程中,沒用當前i 減去棧頂元素下標的原因是,遇到連續一串的()()(),沒辦法連起來;實際上這裡只要加入乙個小trick就好了:每一次遇到)的時候,先pop,再算i - stack.top(), 因為stack.top()這個時候,是前面最近乙個還沒被消掉的 (, 減去它就是當前最長串的長度。而當棧空的時候,就說明至此為止,前面所有的(都被消掉了(或者根本沒有左括號),所以這個)是不配對的,把它的下標壓進棧中,作為新的子串的起點前。
棧的最初要壓入乙個-1,相當於在最前面加乙個dummy節點。
int longestvalidparentheses(strings)
else}}
return
longest;
}
解法2: dp,count[i]表示 結束於i的有效子串長度。count[i] 的計算:
- s[i]=='(" , 一定0
- s[i]==')',
-s[i-1]=='(', count[i]=count[i-2]+2;
-s[i-1]==')',就是有可能巢狀,要看s[i-count[i-1]-1]是否為『(「,若是,為合法的巢狀,要跟這個巢狀子串前面可能的最長串合併。count[i]=count[i-1]+count[i-count[i-1]-2]+2.
-不是合法巢狀,在這個)處,應清零,count[i]=0;
int longestvalidparentheses(strings)
else count[i]=2
; }
else
else count[i]=count[i-1]+2
; }
else
}longest=max(longest,count[i]);}}
return
longest;
}
1478 括號序列的最長合法子段(模擬棧)
這裡有另乙個關於處理合法的括號序列的問題。如果插入 和 1 到乙個括號序列,我們能得到乙個正確的數學表示式,我們就認為這個括號序列是合法的。例如,序列 和 是合法的,但是 和 是不合法的。這裡有乙個只包含 和 的字串,你需要去找到最長的合法括號子段,同時你要找到擁有最長長度的子段串的個數。輸入第一行...
合法的括號串(C 實訓題,棧)
問題描述 乙個合法的括號串,是指只包含括號的串,如果滿足如下條件 1 這四對括號是合法的 2 如果r是合法括號串,則 r 也是 3 如果r,s是合法括號串,則rs也是 所以 是合法的括號串,而 就不是。輸入形式 輸入第一行正整數t 10 n 100 表示有多少組測試資料。後面有t行,每行乙個只包含8...
資料結構之棧的應用(判斷字串中括號的合法性)
需求 判斷乙個字串中的括號是否成對,是否合法?const str1 3223 2 2 2 const str2 22 12 sf1 sdfs 步驟 1.引入棧結構的建構函式 const stack require stack const str1 3223 2 2 2 const str2 22 1...