思路:
另建一个容器栈,
遇见'(',压入
遇见')',分情况
1.容器栈为空时,continue;
2.容器栈size为1时,
若栈顶为'(',pop出,压入num 2;
若栈顶为num,pop出即可;
3.容器栈size大于1时,
若栈顶为'(',pop出,计num为2,再探测栈顶的数据,若为数字,计数字加2压入;
若栈顶为num,则次栈层元素一定为'(',此时pop两次,计num加2压入,再探测栈顶的数据,若为数字,计数字加2压入
实现代码如下:
class Solution
{
public:
int longestValidParentheses(string s)
{
stack<int> iStack;
int iMax = 0;
for (int i = 0; i<s.size(); i++)
{
if (s[i] == '(')
{
iStack.push(0);
}
else
{
if (iStack.size() == 0)
{
continue;
}
else if (iStack.size() == 1)
{
if (iStack.top() == 0)
{
iStack.pop();
iStack.push(2);
iMax = max(iMax, 2);
}
else
{
iStack.pop();
}
}
else
{
if (iStack.top() == 0)
{
iStack.pop();
int num = 2;
if (iStack.top() > 0)
{
num += iStack.top();
iStack.pop();
}
iStack.push(num);
iMax = max(iMax, num);
}
else
{
int temp = iStack.top();
iStack.pop();
iStack.pop();
temp += 2;
if (!iStack.empty() && iStack.top() > 0)
{
temp += iStack.top();
iStack.pop();
}
iMax = max(iMax, temp);
iStack.push(temp);
}
}
}
}
return iMax;
}
};