leetcode 32. Longest Valid Parentheses
link
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 "()()"
題意:
我又讀題渣渣了。 題意上在給定的string s 上,找到一個合法的子串,該子串是一個合法的括號序列。
思路:
當遇到)時我們要去匹配(,匹配(的問題一般交給棧來解決。
維護一個棧st, 保存所有可用的 ( 的下標。
維護一個數preRight,表示上一次st清空的位置。
如上述,遇到 ( 的時候無腦push。
當遇到):
若棧為空,則以該串及其左邊為起始肯定是不合法的。 【否則匹配到這個)的時候會遇到沒有(可以用的問題】。 因此清空stack, 記錄目前的下標為preRight。
若棧不為空, 則可以匹配棧頂的(, pop掉這個(後,
若棧非空,則以此)結尾的子串的合法起始位置是st.top() + 1, e.g. (()() , ((()),紅色為起始位置,藍色為top,灰底為枚舉的)。 ans = max(ans, i - (st.top() + 1) + 1);
若棧為空,則就要用到之前preRight的位置了。 ans = max(ans, i - preRight);
CODE:
class Solution { public: int longestValidParentheses(string s) { int ans = 0, tmp = 0; stack<int> st; int preRight = -1; for(int i = 0; i < s.length(); i++ ){ if(s[i] == ‘(‘) { st.push(i); } else{ if(st.empty()) { preRight = i; while(!st.empty()) st.pop(); }else{ st.pop(); if(st.empty()){ ans = max(ans, i - preRight); }else{ ans = max(ans, i - st.top()); } } } } return ans; } };
leetcode 32. Longest Valid Parentheses