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;
        }
    }
    
  • 相关阅读:
    JAVA学习日报 11/26
    JAVA学习日报 11/25
    大二寒假作业之JavaWeb
    大二寒假作业之JavaWeb
    大二寒假作业之JavaWeb
    大二寒假作业之《构建之法》读后感2
    大二寒假作业之Android
    大二寒假作业之《构建之法》读后感1
    大二寒假作业之android
    大二寒假作之Android
  • 原文地址:https://www.cnblogs.com/acbingo/p/9302261.html
Copyright © 2011-2022 走看看