【leetcode】32. Longest Valid Parentheses 最長的有效匹配括號子串長度

knzeus發表於2019-05-11

1. 題目

Given a string containing just the characters `(` and `)`, find the length of the longest valid (well-formed) parentheses substring.

For “(()”, the longest valid parentheses substring is “()”, which has length = 2.

Another example is “)()())”, where the longest valid parentheses substring is “()()”, which has length = 4.

2. 思路

模擬進出棧來計算。但是由於可能遇到字尾不匹配的情況,因此,在每次遇到一個字首起點的合法串後都進行比較記錄是否是最大合法串。
這樣缺少考慮了字首不匹配的情況。將整個串反轉、顛倒一下,重複上面的計算。
得到兩個數的大的那一個即時最大值。

3. 程式碼

class Solution {
public:
    // 進棧出棧驗證, 出現不匹配時清空堆疊
    // 由於只有一種括號型別, 因此只需要記錄在棧中的左括號的數量即可
    // 對遇到的所有有效情況記錄最大值
    // 由於最後可能遇到一個末端無效的串
    //   但前面有效部分可能是最大的,
    //   因此進行一次反轉後,再次計算,求最大值
    int longestValidParentheses(string s) {
        int c1 = f(s);
        //cout << s << c1 << endl;
        // 對於字首無效的通過反轉同等計算
        reverse(s.begin(), s.end());
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == `(`) {
                s[i] = `)`;
            } else {
                s[i] = `(`;
            }
        }
        int c2 = f(s);
        //cout << s << c2 << endl;
        return max(c1, c2);
    }
    int f(string& s) {
        int left_cnt = 0;
        int max = 0;
        int cur = 0;
        for (int i = 0; i < s.length(); i++) {
            char co = s[i];
            if (co == `)`) {
                if (left_cnt == 0) {
                    if (max < cur) {
                        max = cur;
                    }
                    cur = 0;
                    continue;
                } else {
                    left_cnt--;
                    cur++;
                    // 匹配到一個臨時的有效串, 後續有可能有更長的, 不清零繼續嘗試
                    // 也有可能找到的最長的是一個字尾無效的
                    if (left_cnt == 0 && cur > max) {
                        max = cur;
                    }
                }
            } else {
                left_cnt++;
                cur++;
            }
        }
        return max;
    }
};

相關文章