856. 括号的分数
https://leetcode-cn.com/problems/score-of-parentheses/
给定一个平衡括号字符串 S
,按下述规则计算该字符串的分数:
()
得 1 分。AB
得A + B
分,其中 A 和 B 是平衡括号字符串。(A)
得2 * A
分,其中 A 是平衡括号字符串。
示例 1:
输入: "()"
输出: 1
示例 2:
输入: "(())"
输出: 2
示例 3:
输入: "()()"
输出: 2
示例 4:
输入: "(()(()))"
输出: 6
提示:
S
是平衡括号字符串,且只含有(
和)
。2 <= S.length <= 50
思路分析:
使用栈完成该题的求解,我们以示例4为例:
首先我们定义一个栈结构:元素为String类型
存放的策略:
- 如果是左括号:我们选择直接将其放到栈中
- 如果是右括号:我们判断栈顶元素是否为左括号:
- 如果是,将栈顶的左括号pop出来,存放一个1进去
- 如果不是,则将里面的元素和计算出来,最后将左括号pop出来,将元素和 * 2存放到栈中
最后我们将栈中的元素和全部pop出来相加即得到我们的结果集
代码实现
class Solution {
public int scoreOfParentheses(String s) {
//定义一个栈结构
Deque<String> stack = new LinkedList<>();
for(int i = 0; i < s.length(); i++) {
//判断该位置的字符是否为'('
if(s.charAt(i) == '(') {
stack.push(String.valueOf(s.charAt(i)));
}else {
//此时判断stack栈顶元素是否为数字
if(!stack.peek().equals("(")) {
int temp = 0;
while(!stack.peek().equals("(")) {
temp += Integer.parseInt(stack.pop());
}
stack.pop(); //pop出左括号
stack.push(String.valueOf(temp * 2));
}else {
//说明是'(',//将右括号pop出来
stack.pop();
stack.push("1");
}
}
}
//定义结果集
int res = 0;
while(!stack.isEmpty()) {
res += Integer.parseInt(stack.pop());
}
return res;
}
}