Longest Valid Parentheses
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.
<pre name="code" class="cpp">#include <iostream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
class Solution {
public:
int longestValidParentheses(string s) {
if(s.empty()) return 0;
stack<int> leftStack;
int ret = 0;
int currentMax = 0;
int leftPos;
vector<int> dp(s.length()+1,0); //to check consistent pairs, eg: ()()
for(int i = 0; i <s.length(); i++)
{
if(s[i]==')')
{
if(leftStack.empty())
{
currentMax = 0;
}
else
{
leftPos = leftStack.top();
leftStack.pop();
currentMax = i-leftPos+1 + dp[leftPos];
dp[i+1] = currentMax;
//<这一点十分的巧妙,因为要寻找最大字串,因此在找到)的时候,记录下一个i+1的dp,
//因为只有当从i+1开始能够进行匹配,当前字串才有效果
ret = max(ret,currentMax);
}
}
else
{
leftStack.push(i); //push the index of '('
}
}
return ret;
}
};
void main()
{
Solution test;
int x = test.longestValidParentheses("()(()");
cout << x;
}
代码中使用到stack:
stack是栈适配器,以deque容器为基础实现的,但是不能直接访问deque所提供的操作
相关stack的函数:
s.empty() 判断是否为空
s.size()
s.pop()删除栈顶元素,但是不返回其值
s.top()返回栈顶元素,但是不删除其值
s.push(item)压栈