32 最长有效括号
本题利用栈来解。
用栈维护当前待匹配的左括号的位置,同时用 start 记录一个新的可能合法的子串的起始位置,初始设为0。如果s[i] =='(',那么把i进栈。如果s[i] == ')',那么弹出栈顶元素 (代表栈顶的左括号匹配到了右括号),出栈后:如果栈为空,说明以当前右括号为右端点的合法括号序列的左端点为start,则更新答案 i - start + 1。如果栈不为空,说明以当前右括号为右端点的合法括号序列的左端点为栈顶元素的下一个元素,则更新答案i - st.top() 。
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> st;
int ans = 0;
for (int i = 0,start = 0; i < s.size(); i++)
{
if (s[i] == '(') st.push(i); //左括号入栈
else
{
if (!st.empty())
{
st.pop(); //匹配成功
if (st.empty()) ans = max(ans, i - start + 1);
else ans = max(ans, i - st.top()); //i - st.top() + 1 - 1
}
else start = i + 1; //更新起点
}
}
return ans;
}
};
856 括号的分数
本题利用栈来写。
如果是嵌套括号,得分要乘二
如果是并列,得分相加
所以关键是判断出栈的右括号是嵌套还是并列,其实很简单,只需要结合前一个括号就能很容易判断
如果 ) 前面是 (, 即 (), 那毫无疑问是并列的
如果 ) 前面还是 ), 即 ...)), 那自然是嵌套的
然后我们将每层的分数叠加到栈顶,最后得分就是题目所求
class Solution {
public:
int scoreOfParentheses(string s) {
int ans = 0, pre = ')';
vector<int> st;
for (char c: s) {
if (c == '(') st.push_back(0);
else {
int cur = st.back(); st.pop_back();
if (pre == '(') cur++;
else cur *= 2;
if (st.empty()) ans += cur;
else {
st[st.size() - 1] += cur;
}
}
pre = c;
}
return ans;
}
};