32. Longest Valid Parentheses

来源:互联网 发布:关于茶的软件 编辑:程序博客网 时间:2024/06/16 13:23

栈的典型应用。能想到栈,但是能想到Push字符索引,真的不是很容易(这道题一般的想法是存储‘(’ ‘)’这些符号)。

原题

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.

代码实现

         //栈的典型应用        //能想到栈,但是能想到Push字符索引,真的不是很容易(这道题一般的想法是存储‘(’  ‘)’这些符号)        public int LongestValidParentheses(string s)        {            int n = s.Length, longest = 0;            Stack<int> st = new Stack<int>();            //第一部分:首先抵消掉所有的合法的括号对            //留下来的都是一些卡槽(这些卡槽正是分隔区间)            for (int i = 0; i < n; i++)            {                if (s[i] == '(') st.Push(i);                else                {                    if (st.Count > 0)                    {                        if (s[st.Peek()] == '(') st.Pop();                        else st.Push(i);                    }                    else st.Push(i);                }            }            //第二部分:分析这些卡槽,求出最大卡槽长度            //最大卡槽便是s的最大字符数            if (st.Count == 0) return n;            //至少有卡槽,求出最大长度            int slot = n;            while (st.Count > 0)            {                int tmpslot = st.Pop();                longest = Math.Max(longest, slot - tmpslot-1);                slot = tmpslot;            }            longest = Math.Max(longest, slot-0);            return longest;        }