leetcode-856. 括号的分数详解

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:

  • () 得 1 分。
  • AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
  • (A) 得 2 * A 分,其中 A 是平衡括号字符串。

示例:                  答案:

(()(()))     6

思路分析:

一开始想把每种组合"()",")(","((","))"代表的运算符写出来组成一个算术表达式计算,结果试了多次还是不对.

只好按照括号直接开始计算.使用string表示会特别耗时,所以我用-1表示(,0表示),0和-1是一定不会在算式中出现的,所以可以用来区分正在计算的数字和原来的括号.<(~︶~)>非常高兴通过了.

代码:

 public int scoreOfParentheses(String S) {
        ArrayList<Integer> chars = new ArrayList<>();
        int len = S.length();
        for (int i = 0; i < len; i ++) {
            chars.add(S.charAt(i) - 41);
        }
        int last = -1;
        for (int i = 0; i < chars.size();) {
            int a = chars.get(i);
            if (a == 0 && last == -1) {
                chars.remove(i);
                chars.remove(i - 1);
                chars.add(i - 1, 1);
            } else {
                i ++;
            }
            last = a;
        }

        len = chars.size();
        if (len == 1) {
            return 1;
        }
        if (len == 2) {
            return 2;
        }
        while (chars.size() != 1) {
            for (int i = 0; i < chars.size(); i++) {
                int a = chars.get(i);
                if (chars.size() > i + 2) {
                    int llast = chars.get(i + 2);
                    last = chars.get(i + 1);
                    if (a == -1 && llast == 0 && last != 0 && last != -1) {
                        chars.remove(i + 2);
                        chars.remove(i + 1);
                        chars.remove(i);
                        chars.add(i, last * 2);
                        i --;
                    } else if (last != 0 && last != -1 && a != 0 && a != -1) {
                        chars.remove(i + 1);
                        chars.remove(i);
                        chars.add(i, a + last);
                        i --;
                    }
                } else if (chars.size() > i + 1) {
                    last = chars.get(i + 1);
                    if (last != 0 && last != -1 && a != 0 && a != -1) {
                        chars.remove(i + 1);
                        chars.remove(i);
                        chars.add(i, a + last);
                        i --;
                    }
                }
            }
        }
        return chars.get(0);
    }

代码很好理解,

  1. 碰到()就置为1
  2. 判断数组长度是否为1,不为1则->3,为1则直接返回第一个值
  3. 从i=0开始对当前数组进行遍历,如果数组大小大于i+2,->4;如果数组大小为i+1,->5.
  4. 当前数设为a后面一个数设为last(之前想从后往前算的,就没改名称,凑合看看- -),a后面的后面的数设为llast,如果a =-1,llast = 0,中间的数字不等于0也不等于-1则对last×2放进a的位置,并且把a,last,llast都移除;如果a和last上的数字都不代表(),那么就将两数相加放进a的位置,并且移除a和last
  5. 如果last和a都不代表(),将两数相加放进a的位置,并且移除a和last

代码提交上去后,运行时间10ms,看了下5ms的范例.

发现他用的这个分别算()数量的想法我也有过 (`・ω・´),另外还用了递归算法.算法题果然还是越精简越棒!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值