32、Longest Valid Parentheses
最长有效括号
给定一个仅仅包含'('
或
')'
的字符串,找出其中最长有效括号组成的子集的长度。
字符串
"(()"
,它的最长有效号符子集是
"()"
,长度为2。
另一个例子
")()())"
,它的最长有效括号子集是
"()()"
,长度是4。
分析:
这道题的难点在于,判断括号有效后,还需要记录括号的有效长度。
我们使用一个stack来模仿括号的动态变化,一个int类型res记录长度。
stack的类型为,一个int记录括号位置,一个bool表示为左或右括号(判断是否匹配)。
遍历字符串:
1.(:
进栈
2.):
1>栈的前一个元素为空,进栈
2>栈的前一个元素为’(‘,匹配则出栈,然后用当前元素位置减去栈顶位置即为所得长度,然后和res比较。
3>栈的前一个元素为‘)’,进栈。
代码:
class Solution {
public:
class pair//一对
{
public:
int position;//位置
int FF;//翻转器
};
int longestValidParentheses(string s) {
stack<pair> stack;
pair temp;
temp.position=-1;
temp.FF=false;
stack.push(temp);//栈顶添加一个空元素,防止溢出
int res=0;//字符串长度
for(int i=0;i<s.length();i++)
switch(s[i])
{
case'('://进栈
temp.position=i;
temp.FF=true;
stack.push(temp);
break;
case')':
if(stack.empty())//进栈
{
temp.position=i;
temp.FF=false;
stack.push(temp);
}
else if(stack.top().FF)//出栈
{
stack.pop();
res=max(res,i-stack.top().position);
}
else//进栈
{
temp.position=i;
temp.FF=false;
stack.push(temp);
}
break;
default:
break;
}
return res;
}
};