題目描述:
Given a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()" Output: 2 Explanation: The longest valid parentheses substring is "()"
代碼:
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> idStack;
idStack.push(-1);
int max = 0;
for(int i = 0; i < s.length(); i++){
int st = idStack.top();
if(st != -1 && s[st] == '(' && s[i] == ')'){
idStack.pop();
if(i - idStack.top() > max) max = i - idStack.top();;
}else{
idStack.push(i);
}
}
return max;
}
};
以前遇到題,總是硬着頭皮死扣,從來不會去參考別人的代碼。這樣既有好處又有壞處吧,好處就是自己的編碼能力理所當然提升更大,壞處就是就算這樣做一萬道題,代碼還是會又臭又長。所以,對於剛剛入門的兄弟,我建議儘量少甚至不要去參考別人的代碼,根據自己的思路去寫,一定要相信不管什麼樣的題目,只要你能拿筆算出來,那麼一定能通過代碼寫出來,大不了就是多幾個if else的事情嘛: ) 。對於有一定編碼能力的人,我建議發現自己的思路有點複雜後,儘量多去參考一下別人的代碼,用別人歎爲觀止的算法來一步步論證自己的腦子屬於豬類,在自我否定中茁壯成長,哈哈。
比如這道題,感謝原作者的算法將我虐的體無完膚。以前做過類似的判斷括號是否匹配的題,算法是利用一個棧,左括號進棧,右括號出棧,若右括號到了,棧爲空,則括號不匹配。開始我也採用類似的思路,從左開始遍歷括號串,得到每個位置最大匹配括號串的長度,最後再取最大值,最後收到一個WA,然後發現題目自己的方法,在遇到左括號多於右括號的時候會出錯。於是去discuss區參考到了這位大神的代碼,算法思路如下:
只需要遍歷一遍括號串,用一個棧來記錄上一個絕對不可能匹配到的位置的下標。然後從這個地方開始找之後的匹配穿的長度。方法很巧,可以自己找一個串手動跑一下就知道了。
靜心盡力!