题目:
思路:
遍历括号.遇到右括号然后前一个是左括号 那就res+2,然后重定位 i 的值 并且长度减少2;
但是问题在于无法判断最长的括号.只能得到string内的全部括号长度.
错误代码:
写过一题类似的,那题是找括号数.记得是使用的栈,但是死活写不出来.
看完答案觉得答案有一些反常.
代码是:
cpp
//code
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.length();
int res = 0;
stack<int> st; // 栈用来记录左括号的位置
st.push(-1); // 将-1压入栈中,作为一个"虚拟的"左括号位置
for (int i = 0; i < n; i++) {
if (s[i] == '(') { // 如果是左括号,将其位置压入栈中
st.push(i);
} else { // 如果是右括号
st.pop(); // 弹出栈顶的左括号位置
if (st.empty()) { // 如果栈为空,说明当前的右括号没有匹配的左括号
st.push(i); // 将当前的右括号位置压入栈中,作为下一个"虚拟的"左括号位置
} else { // 如果栈不为空,计算当前的括号子串长度
res = max(res, i - st.top());
}
}
}
return res; // 返回最长有效括号长度
}
};
在代码中当判断到右括号时 栈st 先 pop 然后再进行判断. 有点神奇..