zoukankan      html  css  js  c++  java
  • 1021--RemoveOutermostParentheses

    public class RemoveOutermostParentheses {
        /*
        解法一:栈,( 进栈,) 出栈,栈为空时,则找到原语,然后去括号。
         */
        public String removeOuterParentheses(String S) {
            StringBuilder sb=new StringBuilder();
            Stack<Character> stack=new Stack<>();
            int start=0;    int end=0;
            for (int i=0;i<S.length();i++){
                char c=S.charAt(i);
                if (c=='('){
                    stack.push(c);
                }
                if (c==')'){
                    stack.pop();
                    if (stack.isEmpty()){
                        end=i;
                        sb.append(S.substring(start+1,end));
                        start=end+1;
                    }
                }
            }
         return sb.toString();
        }
        /*
        解法二:数字标记代替栈,从上面的代码中,我发现,栈起的作用并不是需要特定的括号,而只是判断是否为空来找原语。
                而进栈出栈又消耗时间,所以可以用一个整数来代替栈。
         */
        public String removeOuterParentheses2(String S) {
            StringBuilder sb=new StringBuilder();
            int flag=0;
            int start=0;    int end=0;
            for (int i=0;i<S.length();i++){
                char c=S.charAt(i);
                if (c=='('){
                    flag++;
                }
                if (c==')'){
                    flag--;
                    if (flag==0){
                        end=i;
                        sb.append(S.substring(start+1,end));
                        start=end+1;
                    }
                }
            }
            return sb.toString();
        }
        /*
        解法三:解法二优化:分析发现,并不需要用end来标记末尾,直接用i就可以了,快了1ms;
         */
        public String removeOuterParentheses3(String S) {
            StringBuilder sb=new StringBuilder();
            int start=0;
            int flag=0;
            for (int i=0;i<S.length();i++){
                char c=S.charAt(i);
                if (c=='('){
                    flag++;
                }
                if (c==')'){
                    flag--;
                    if (flag==0){
                        sb.append(S.substring(start+1,i));
                        start=i+1;
                    }
                }
            }
            return sb.toString();
        }
        /*
        解法四:最优解:判断的原理是和上面的一样的,但是上面的代码都是找到一个原语后,在原字符串上进行切割,比较费时间。
                        下面是挨个字符判断,如果满足条件,则直接添加。
         */
        public String removeOuterParentheses4(String S) {
           StringBuilder sb=new StringBuilder();
           int currentDepth=0;
           for (char c:S.toCharArray()){
               if (c=='('&&(currentDepth +=1)>1) sb.append(c);
               else if (c==')'&&(currentDepth -=1)>=1) sb.append(c);
           }
           return sb.toString();
        }
    }
  • 相关阅读:
    005 Python的IDE之Pycharm的使用
    006 Python的IDE之Jupyter的使用
    004 pip的使用
    003 Python解释器源修改
    002 Python解释器安装
    BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)
    BZOJ 2085 luogu P3502 [POI2010]Hamsters (KMP、Floyd、倍增)
    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)
    UOJ #214 [UNR #1]合唱队形 (概率期望计数、DP、Min-Max容斥)
    LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)
  • 原文地址:https://www.cnblogs.com/zhangyuhao/p/11572345.html
Copyright © 2011-2022 走看看