1. 程式人生 > >leetcode 32. Longest Valid Parentheses

leetcode 32. Longest Valid Parentheses

stack urn example return subst problem 題意 cnblogs 目前

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 "()()"

, which has length = 4.

題意:

我又讀題渣渣了。 題意上在給定的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