持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
刷题的日常-2022年10月9号
一天一题,保持脑子清爽
括号的分数
来自leetcode的 856 题,题意如下:
给定一个平衡括号字符串S,按下述规则计算该字符串的分数:
- () 得 1 分。
- AB 得A + B分,其中 A 和 B 是平衡括号字符串。
- (A) 得2 * A分,其中 A 是平衡括号字符串。
示例1:
输入: "()"
输出: 1
示例2:
输入: "(())"
输出: 2
示例3:
输入: "()()"
输出: 2
理解题意
我们可以从题意中提取的条件如下:
- 题目给出一个字符串
- 要求我们根据规则计算出括号的得分
- 如果出现 (),得一分
- 如果出现两个括号阔在一起,得 2 * 子括号得分
- 如果交替出现,则相加
做题思路
这里直接采用暴力模拟得方法:
- 开辟一个栈进行保存当前结果,如果是 (,直接压栈
- 如果是 ),需要弹出栈顶元素,规则如下
- 如果栈顶的元素是数字,则需要乘以2,然后再弹出 ( 括号
- 如果栈顶的元素是 (,则当前为 1
- 栈顶元素弹出之后,需要判断之前的数是不是数值,如果是的话还需要将数值加上去
- 最后将栈里面的数相加返回即可
代码实现
代码实现如下:
public class Solution {
S<Pair> nums;
public int scoreOfParentheses(String s) {
nums = new S<>(s.length());
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ')') {
Pair pop = nums.pop();
if (pop.isNum) {
pop.num *= 2;
while (!nums.isEmpty() && nums.peek().isNum) {
pop.num += nums.pop().num;
}
if (!nums.isEmpty()) {
nums.pop();
}
} else {
pop.num = 1;
}
while (!nums.isEmpty() && nums.peek().isNum) {
pop.num += nums.pop().num;
}
pop.isNum = true;
nums.push(pop);
continue;
}
nums.push(new Pair());
}
int result = nums.pop().num;
while (!nums.isEmpty()) {
result += nums.pop().num;
}
return result;
}
}
class Pair { boolean isNum;int num;}
class S<T> {
int idx = -1;
Object[] stack;
public S(int maxSize) {stack = new Object[maxSize];}
boolean isEmpty() {return idx == -1;}
boolean isFull() {return idx == stack.length;}
boolean push(Object num) {if (isFull()) {return false;}stack[++idx] = num;return true;}
T pop() {return (T) stack[idx--];}
T peek() {return (T) stack[idx];}
}