题目:
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.
例子:
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()"
问题解析:
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
思路标签
栈、动态规划
解答:
1.栈
- 使用栈这里需要注意题目的要求,我们寻找的是最长的有效括号的长度,所以这是一个寻找连续子子串的问题。
- 所以,为了判断连续的问题,我们在栈中保存每个符号的索引位置i,而不是每个符号的值。
- 通过判断当前匹配右括号和栈弹出元素后的栈顶元素的索引位置,来记录最大匹配长度。
class Solution {
public:
int longestValidParentheses(string s) {
if(s.length() == 0)
return 0;
int res = 0;
stack<int> st;
st.push(-1);
for(int i=0; i<s.length(); ++i){
if(s[i] == '('){
st.push(i);
}
else{
st.pop();
if(!st.empty()){
res = max(res, i-st.top());
}
else{
st.push(i);
}
}
}
return res;
}
};
2.动态规划
- 网友给出的动态规划的解法。
- dp[i]表示以当前位置为终点的最长长度,则只能在)处更新;
- 如果s[i-1-dp[i-1]]==’(‘,则说明当前位置可以和i-1-dp[i-1]位置匹配,dp[i]=dp[i-1]+2;
- 然后还要加上匹配位置之前的最长长度dp[i]+=dp[i-dp[i]];
class Solution {
public:
int longestValidParentheses(string s)
{
int result=0;
s=')'+s;
vector<int> dp(s.length(),0);
for(int i=1;i<s.length();i++)
{
if(s[i]==')')
{
if(s[i-1-dp[i-1]]=='(') dp[i]=dp[i-1]+2;
dp[i]+=dp[i-dp[i]];
}
result=max(result,dp[i]);
}
return result;
}
};