Leetcode Problems

  • 032 Longest Valid Parentheses

    给出一个只含括号字符串,求最长的括号匹配的字串长度。

    ​ 一开始自己的想法是从左向右扫,利用一个栈,碰到左括号则进栈,碰到右括号且栈顶为左括号则此时匹配长度length加2,否则length重置为0,维护length的最大值。

    但是,对于下面的两个case

    1. “()(()” ===> 2
    2. “()(())” ===> 6

    按照这个思路会把例子1算出4,显然不对。对于加粗的左括号,在例子1中需要重置length(加粗左括号间隔点),在例子2中又不需要重置length(加粗左括号不是间隔点),所以什么时候重置length为0就比较棘手了,一直没想出来。

    按照Dissusion的思路,只需要把index放进栈就可以了,用栈来记录所有的间隔点

    1. 是左括号就把它的index进栈
    2. 是右括号就且栈顶对应的符号是左括号,则退栈,否则index进栈
    3. 匹配的都退栈退掉了,剩下在栈中的就说所有不能匹配的间隔点的index,根据这个算最大值。

    自己错误的代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    class Solution {
    public:
    int longestValidParentheses(string s) {
    if (s.size() < 2)
    return 0;
    stack<char> S;
    int start = 0;
    int ans = 0;
    int length = 0;
    while (s[start] == ')')//去掉前缀')'
    {
    start++;
    }
    S.push(s[start]);
    for (int i = start + 1; i < s.size(); ++i)
    {
    char c = s[i];
    if (c == '(')
    {
    if (!S.empty())
    {
    ans = max(length, ans);
    length = 0;
    }
    S.push(c);
    } else if (c == ')')
    {
    if (!S.empty() && S.top() == '(')
    {
    length += 2;
    S.pop();
    } else // top is ')' or null, is match
    {
    ans = max(ans, length);
    length = 0;
    }
    }
    }
    return max(length, ans);
    }
    };

    AC的代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    //记录断的位置
    class Solution
    {
    public:
    int longestValidParentheses(string s)
    {

    if (s.size() < 2)
    return 0;
    stack<int> st;
    st.push(-1);
    for (int i = 0; i < s.size(); ++i)
    {
    char c = s[i];
    if (c == '(')
    {
    st.push(i);
    } else //c==')'
    {
    if (st.size() > 1 && s[st.top()] == '(')
    {
    st.pop();
    } else
    {
    st.push(i);
    }
    }
    }
    st.push(s.size());
    int ans = 0;
    int pre = st.top();
    st.pop();
    while (!st.empty())
    {
    ans = max(ans, pre - st.top() - 1);
    pre = st.top();
    st.pop();
    }
    return ans;
    }


    };