【leetcode】32. 最長有效括號(longest-valid-parentheses)(模擬)[困難]

鏈接

https://leetcode-cn.com/problems/longest-valid-parentheses/

耗時

解題:2 h
題解:33 min

題意

給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。

思路

用一個與字符串長度相同的標記數組來記錄對應位置的括號是否合法,這樣問題就轉化成了求標記數組中最長的標記爲合法的子序列的長度,這是非常容易的。
那麼如何判斷每個括號是否合法呢?
我的策略:遍歷字符串,維護當前可用的 “(” 的數量,當遇到 “)” 並且當前存在可用 “(” 時,則尋找它對應的 “(”,如果能找到,則它們合法。在尋找對應的 “(” 時,維護一個當前已經遍歷過的元素中不合法元素的數組,如果最後一個不合法的元素爲 “(”,則標記它們 “(***)” 爲合法。

時間複雜度:O(n)O(n)

AC代碼

class Solution {
public:
    int longestValidParentheses(string s) {
        int n = s.size();
        int l_num = 0;
        vector<bool> valid(n, false);
        vector<int> invalid_elem;
        for(int i = 0; i < n; ++i) {
            if(s[i] == '(') {
                l_num++;
            }
            else if(s[i] == ')' && l_num > 0) {
                if(!invalid_elem.empty() && s[invalid_elem.back()] == '(') {
                    valid[invalid_elem.back()] = true;
                    valid[i] = true;
                    l_num--;
                    invalid_elem.pop_back();
                }
            }
            if(valid[i] == false) {
                invalid_elem.push_back(i);
            }
        }
        
        int ans = 0;
        int sub_len = 0;
        for(int i = 0; i < n; ++i) {
            valid[i] == true ? sub_len++ : sub_len = 0;
            ans = max(ans, sub_len);
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章