括号的分数
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.0 MB
/*
* 思路:
* 1. 使用栈和Stream API来计算括号的分数。
* 2. 遍历字符串时,使用不同的流操作处理不同的括号情况。
* 3. 使用reduce方法累积结果。
*/
import java.util.Stack;
import java.util.stream.IntStream;
public class ScoreOfParenthesesStream {
public int scoreOfParentheses(String S) {
Stack<Integer> stack = new Stack<>();
return IntStream.range(0, S.length()).map(i -> {
char c = S.charAt(i);
if (c == '(') {
stack.push(0);
} else {
int v = stack.pop();
stack.push(stack.pop() + Math.max(2 * v, 1));
}
return 0; // 返回0,因为map要求返回一个值,但不使用此值。
}).sum();
}
}
解释
方法:
该题解采用了栈的数据结构来分析和计算括号字符串的分数。对于遇到的每个'(',直接将其压入栈中;对于每个')',首先尝试弹出栈顶元素直到遇到'(',累加这些元素的值作为当前括号内部的分数(如果栈顶是'(',则内部分数为0)。之后,将'('弹出栈,并根据内部的分数来决定将1(如果内部分数为0)还是2倍内部分数(如果内部分数不为0)压入栈中。最后,栈中剩余的数值为不同部分的分数,将这些数值累加即得到最终的分数。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在解题思路中,为什么选择使用栈来处理这个问题,而不是其他数据结构如队列或递归?
▷🦆
题解中提到,对于每个')'字符,都需要弹出栈中的元素直到遇到'('。这个过程在遇到多层嵌套括号时是如何确保正确计算内部分数的?
▷🦆
题解中没有明确说明如何处理连续的平行括号如'()()',这种情况下的计算逻辑是什么?
▷