Longest Valid Parentheses
题目大意
给你一个括号构成的字符串,检测其中合法的最长的字符串。如”)()())”,则结果为4.
我的解法
解题思路
使用一个栈来处理字符串,左括号’(‘进栈,右括号’)’出栈。合法字符串被不合法字符串隔开,这种不合法字符串有两种。
第一种是栈为空的时候,进入的右括号。
第二种是字符串结束时,没有出栈的左括号。
程序最后要将不合法字符的下标存在栈中,再遍历栈计算长度。
代码
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> st;
int stack_down = 0;
for(int i=0; i<s.length(); i++)
{
if(s[i]=='(')
{
st.push(i);
}
else if(st.size()>stack_down)
{
st.pop();
}
else
{
st.push(i);
stack_down++;
}
}
if(st.empty())
{
return s.length();
}
int max = 0;
int pop = s.length();
while(!st.empty())
{
int count = pop - st.top()-1;
pop = st.top();
st.pop();
if(count>max)
{
max = count;
}
}
if(pop > max)
max = pop;
return max;
}
};
优解
解题思路
基本一致,但是代码更简练一些
代码
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.length(), longest = 0;
stack<int> st;
for (int i = 0; i < n; i++) {
if (s[i] == '(') st.push(i);
else {
if (!st.empty()) {
if (s[st.top()] == '(') st.pop();
else st.push(i);
}
else st.push(i);
}
}
if (st.empty()) longest = n;
else {
int a = n, b = 0;
while (!st.empty()) {
b = st.top(); st.pop();
longest = max(longest, a-b-1);
a = b;
}
longest = max(longest, a);
}
return longest;
}
};