栈的典型应用。能想到栈,但是能想到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;
}