zoukankan      html  css  js  c++  java
  • [leetcode] 32. 最长有效括号

    32. 最长有效括号

    这个题挺有意思,思路有些巧。硬上是不行的。

    很明显,遇到括号匹配问题一定要从栈开始思考

    说白了,这就是一个匹配消除的游戏,我给大家举个例子演示一波大家就看明白了,也就知道怎么做了

    )(()()))(   ->  )(22))(  -> )(4))(  -> )6)(  ,没有再可以匹配消除的块了,结束,答案为6
    
    ()()(()  ->  22(2 -> 4(2 ,没有再可以匹配消除的块了,结束,答案为4
    
    

    假设输入数列几位S

    基本解法是维护一个栈,从S第一个元素开始一次扫描

    1. 当碰到(,入栈
    2. 当碰到),查看当前的栈首元素
      2.1 如果栈首元素是(,pop这个(,压入数字2
      2.2 如果栈首元素是数字,弹出并累加这个数字,直到栈首元素为(或栈空。栈空的话直接将累加结果入栈;栈首元素为(的话累加结果+2再入栈
    3. 当S扫完后,当前栈中可能还会有可以匹配的结果,如例一,一次扫描后的结果状态会是: )(4))( ,显然此时不是最终答案。所以需要将当前结果栈转成S,继续执行1,2操作,直到栈的长度不再变化,说明能匹配的都匹配完成了。
    4. 此时栈中的最大值即为所求结果。
    class Solution {
        public Stack<Integer> match(Stack<Integer> stack) {
            Stack<Integer> newStack = new Stack<>();
    
            int now = 0;
    
            for (Integer i : stack) {
                if (i == -1) {
                    if (now > 0) {
                        newStack.push(now);
                        now = 0;
                    }
                    newStack.push(-1);
                } else if (i == -2) {
                    if (!newStack.empty() && newStack.peek() == -1) {
                        newStack.pop();
                        now += 2;
                    } else {
                        if (now > 0) {
                            newStack.push(now);
                            now = 0;
                        }
                        newStack.push(-2);
                    }
                } else {
                    now += i;
                }
            }
            if (now != 0) {
                newStack.push(now);
            }
    
            return newStack;
        }
    
        public int longestValidParentheses(String s) {
            Stack<Integer> stack = new Stack<>();
    
            int ans = 0;
            int max = 0;
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '(') {
                    stack.push(-1);
                } else {
                    stack.push(-2);
                }
            }
    
            int last_size = stack.size();
            while (!((stack = match(stack)).size() == last_size)) {
                last_size = stack.size();
            }
    
            while (!stack.empty()) {
                Integer pop = stack.pop();
                max = Math.max(pop, max);
            }
    
            return max;
        }
    }
    
  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/acbingo/p/9302261.html
Copyright © 2011-2022 走看看