给定一个平衡括号字符串 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,不为1则->3,为1则直接返回第一个值
- 从i=0开始对当前数组进行遍历,如果数组大小大于i+2,->4;如果数组大小为i+1,->5.
- 当前数设为a后面一个数设为last(之前想从后往前算的,就没改名称,凑合看看- -),a后面的后面的数设为llast,如果a =-1,llast = 0,中间的数字不等于0也不等于-1则对last×2放进a的位置,并且把a,last,llast都移除;如果a和last上的数字都不代表(),那么就将两数相加放进a的位置,并且移除a和last
- 如果last和a都不代表(),将两数相加放进a的位置,并且移除a和last
代码提交上去后,运行时间10ms,看了下5ms的范例.
发现他用的这个分别算()数量的想法我也有过 (`・ω・´),另外还用了递归算法.算法题果然还是越精简越棒!