32-最长有效括号

32. 最长有效括号

括号问题常常可以用栈来处理

  • stack idx ; // 如果是左括号,则左括号的索引入栈
  • vector v; // 记录全部有效括号的索引
    • 如果当前为右括号,且栈顶有左括号,则记录栈顶左括号的索引和当前右括号的索引。
    • 然后idx的栈顶出栈,把与当前右括号匹配的左括号的索引删除掉
  • v中记录的是全部有效括号的索引,因此找到这里边最长的连续递增子串的长度即可
    • 由于弹出的顺序不同,v中的记录可能是乱序的。因此要先排序,再找连续递增子串
class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> idx;  // 如果是左括号,则左括号的索引入栈
        vector<int> v;  // 如果当前为右括号,且栈顶为左括号,则记录栈顶左括号的索引和当前右括号的索引
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] == '(') { // 记录左括号的索引
                idx.push(i);
            } else if (s[i] == ')') { // 更新与当前右括号匹配的左括号的信息
                if (!idx.empty()) { //  防止栈顶为空
                    v.push_back(idx.top()); // 与右括号匹配的左括号的索引入转
                    v.push_back(i); // 有括号的索引入栈
                    idx.pop(); // 匹配过的左括号的索引出栈
                }
            }
        }

        sort(v.begin(), v.end());
        int ans = 0;
        int count = 1;
        for (int i = 1; i < v.size(); ++i) {
            if (v[i - 1] + 1 == v[i]) {
                count++;
                ans = max(ans, count);
            } else {
                count = 1;
            }
        }
        return ans;
    }
};
class Solution(object):
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        idx = []
        v = []
        for i in range(len(s)):
            if s[i] == '(':
                idx.append(i)
            elif (idx):
                v.append(idx.pop())
                v.append(i)
        v = sorted(v)
        ans = 0
        count = 1
        for i in range(len(v)):
            if v[i - 1] + 1 == v[i]:
                count += 1
                ans = max(ans, count)
            else:
                count = 1
        return ans

   转载规则


《32-最长有效括号》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
6-Z字形变换 6-Z字形变换
6. Z 字形变换 模拟遍历过程 用一个flag记录当前是不是需要从上到下(从下到上)转换方向 初始flag设为-1。记录好当前行后,判断是否需要更新flag 如果行数为0或1,则直接返回 class Solution(object)
2021-09-02
下一篇 
第四章:如何实现一个计算器 第四章:如何实现一个计算器
labuladong如何实现一个计算器 227. 基本计算器 II遇到加号,就让这个数变正遇到减号,就让这个数变负遇到乘号,就让当前的数乘上之前的数遇到除号,就让当前数被之前的数除 思路:维护一个栈,若为加减,则直接入栈。若为乘除,则栈顶元
2021-08-26
  目录