• Leetcode----<Longest Valid Parentheses>


    题目描述:

    题解:

    public class LongestValidParentheses {
    
        /**
         * 解法一:暴力解法,超时了
         * 从最大长度的字串,判断字串是否是合格的,如果是,那么当前字串长度就是结果
         * @param s
         * @return
         */
        public int longestValidParentheses2(String s) {
            int len = s.length();
            Stack<Character> stack = new Stack<>();
            String subStr;
            boolean flag = true;
            for (int k = len; k >= 1; k--) {
                for (int i = 0; i+k-1 < len; i++) {
                    subStr = s.substring(i,i+k);
                    stack.clear();
                    flag = true;
                    for (int j = i; j < i+k; j++) {
                        if (s.charAt(j) == '(') {
                            stack.push(s.charAt(j));
                        } else {
                            if (stack.isEmpty()) {
                                flag = false;
                                break;
                            } else {
                                stack.pop();
                            }
                        }
                    }
                    if (flag && stack.isEmpty()) {
                        return k;
                    }
                }
            }
            return 0;
        }
    
        /**
         * 用栈模拟一遍,将所有无法匹配的括号的位置全部置0
         * 例如: "()(()"的mark为[1, 1, 0, 1, 1]
         * 再例如: ")()((())"的mark为[0, 1, 1, 0, 1, 1, 1, 1]
         * 经过这样的处理后, 此题就变成了寻找最长的连续的1的长度
         * @param s
         * @return
         */
        public int longestValidParentheses3(String s) {
            if (s == null || s.isEmpty()) return 0;
            int len = s.length();
            Stack<Integer> stack = new Stack<>();
            int[] tag = new int[len];
    
    
            for (int i = 0; i < len; i++) {
                if (s.charAt(i) == '(') {
                    stack.push(i);
                } else {
                    if (!stack.isEmpty()) {
                        tag[stack.pop()] = 1;
                        tag[i] = 1;
                    }
                }
            }
            int pre = tag[0];
            int result = 0, flag = 0;
            if (pre == 1) {
                flag++;
            }
            for (int i = 1; i < len; i++) {
                System.out.print(tag[i] + " ");
                if (pre == tag[i]) {
                    if (pre == 1) {
                        flag++;
                    }
                } else {
                    pre = tag[i];
                    if (pre == 0) {
                        result = Math.max(result,flag);
                        flag = 0;
                    } else {
                        flag++;
                    }
                }
            }
            result = Math.max(result,flag);
    
            return result;
        }
    
        public int longestValidParentheses(String s) {
            if (s == null || s.isEmpty()) return 0;
            int len = s.length();
            Stack<Character> stack = new Stack<>();
            int tag = 0, result = 0, flag = 0;
            for (int i = 0; i < len; i++) {
                if (s.charAt(i) == '(') {
                    stack.push(s.charAt(i));
                    if (tag > 0) {
                        flag++;
                        if (flag > 1) {
                            result = Math.max(result,tag);
                            tag = 0;
                        }
                    } else {
                        flag = 0;
                    }
    
                } else {
                    if (!stack.isEmpty()) {
                        stack.pop();
                        tag += 2;
                    }
                }
            }
            if (tag > 0) {
                result = Math.max(result,tag);
                tag = 0;
            }
            return result;
        }
    
    }
    
  • 相关阅读:
    Windows消息循环
    python 如何获得网卡的Ip地址
    curl 如何测量它花了多少时间?
    mininet 如何创建有不同带宽的链路
    Emacs学习笔记:多窗口操作
    RYU 如何扔掉一个符合要求的数据包
    RYU OFPMatch 的使用方法
    __attribute__如何使用的记录
    make file 和 GCC标志学习
    mininet and ovs 总结
  • 原文地址:https://www.cnblogs.com/dream-it-possible/p/13237340.html
Copyright © 2020-2023  润新知