题目:
思路:
遍历括号.遇到右括号然后前一个是左括号 那就res+2,然后重定位 i 的值 并且长度减少2;
但是问题在于无法判断最长的括号.只能得到string内的全部括号长度.
错误代码:
写过一题类似的,那题是找括号数.记得是使用的栈,但是死活写不出来.
看完答案觉得答案有一些反常.
代码是:
//codeclass 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 然后再进行判断. 有点神奇..