LeetCode 32 Longest Valid Parentheses

題意:

求最長的合法的括號匹配的串長度。


思路:

如果把'('看做+1')'看做-1的話,一個合法的括號匹配序列表示成前綴和應該是+++0+++++0這種樣子,其中+表示前綴和>0。

爲了避免串的最後一部分出現+++0+++++0++++這種情況,我們可以正反掃兩次序列。

掃的過程就是維護一個sum表示前綴和,一個left表示當前合法序列的起點,每次sum<0的時候更新left,每次sum=0的時候嘗試更新答案。

時間複雜度O(n),空間複雜度O(1)。


代碼:

class Solution {
public:
    int longestValidParentheses(string s) {
        int n = s.size(), ans = 0;
        int left = 0, pos = -1;
        for (int i = 0; i < n; ++i) {
            if (s[i] == '(') {
                ++left;
            } else {
                if (left > 0) {
                    --left;
                    if (left == 0) {
                        ans = max(ans, i - pos);
                    }
                } else {
                    pos = i;
                }
            }
        }
        left = 0, pos = n;
        for (int i = n - 1; i >= 0; --i) {
            if (s[i] == ')') {
                ++left;
            } else {
                if (left > 0) {
                    --left;
                    if (left == 0) {
                        ans = max(ans, pos - i);
                    }
                } else {
                    pos = i;
                }
            }
        }
        return ans;
    }
};


發佈了285 篇原創文章 · 獲贊 41 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章