难度:3
求最长的括号匹配的子串
比如
())()()的括号匹配的子串为(),()()两个,最长的长度为4
解法:
维护一个栈,栈底值为上次匹配失败的位置
首先初始放一个-1入栈代表上次匹配失败的地方为-1
依次扫描字符
若为'(',将位置放入栈中
若为')',若栈中元素大于1个,则代表有'('可匹配,更新最优值,否则更新栈底
显然,对于任意一个部分最长子串,其最后一个字符更新时取的是上一次匹配失败的位置,故所有部分最长子串取得最优结果
代码
class Solution
{
public:
int longestValidParentheses(string s)
{
stack<int>S;
S.push(-1);
int ans=0;
for(string::size_type i=0;i<s.size();i++)
{
//printf("%d\n",S.size());
char ch=s[i];
if(ch == '(')
{
S.push(i);
}
else
{
if(S.size()>1)
{
S.pop();
int tmp=S.top();
ans=max(ans,(int)i-tmp);
}
else
{
S.pop();
S.push(i);
}
}
}
return ans;
}
};