*32. Longest Valid Parentheses

題目描述:

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區參考到了這位大神的代碼,算法思路如下:

只需要遍歷一遍括號串,用一個棧來記錄上一個絕對不可能匹配到的位置的下標。然後從這個地方開始找之後的匹配穿的長度。方法很巧,可以自己找一個串手動跑一下就知道了。

靜心盡力!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章