最长有效括号
用栈记录括号的下标,通过栈顶元素定位有效括号的起始位置,计算最长长度。若遇到左括号,将其下标入栈;若遇到右括号,先弹出栈顶元素,若弹出后栈为空,说明当前右括号是新的无效起始点,将其下标入栈;若栈非空,用当前下标减去栈顶元素,得到以当前右括号为结尾的有效括号长度,更新最大长度,以下是代码解析:
class Solution {public:
int longestValidParentheses(string s) {
stack<int> st;
st.push(-1); // 初始参考点,简化长度计算
int maxLen = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '(') {
st.push(i); // 左括号下标入栈
} else {
st.pop(); // 右括号匹配栈顶左括号
if (st.empty()) {
st.push(i); // 栈空则记录当前右括号为新参考点
} else {
// 计算当前有效括号长度
maxLen = max(maxLen, i - st.top());
}
}
}
return maxLen;
}};
该解法时间复杂度为O(n),空间复杂度为O(n)