/**
* ★☆ 启发:当参考官网的答案看不懂时,看高赞答案或者评论区,评论区的解释更加清晰,代码的解析更加详细的
*/
package 栈;
import java.util.Stack;
/**
* https://leetcode-cn.com/problems/score-of-parentheses/
*
* @author Huangyujun
*
* 思路: 构建一个栈 如果遇到 ( 就往栈里面添加 如果遇到 ) 就去寻找最近的左括号抵消,同时计算里面的分数
*
* 拿(()(()))示例, 栈结构变化如下: [(] # 遇到 ( 往栈添加 [(, (] # 继续添加 [(, 1] # 遇到 )
* ,跟栈顶的( 合成一个1,后push进去 [(, 1, (] # 遇到 ( 往栈添加 [(, 1, (, (] # 继续添加 [(, 1,
* (, 1] # 遇到 ) ,跟栈顶的 ( 合成一个1, push 进去 [(, 1, 2] # 遇到 )
* ,根据栈顶判断,非左括号,则是开始有深度了,找出所有非左括号的,计算出深度(非括号的值是多少,深度就是多少),然后遇到 (
* ,pop掉后,将得分=深度 * 2,push进去 [6] # 遇到 ) ,结构是(1,2), 所以计算的话是 (1 + 2) * 2
*
*/
public class _856_括号的分数 {
public int scoreOfParentheses(String s) {
Stack<String> stack = new Stack<String>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
String ch2 = Character.toString(ch);
if (ch2.equals("(")) { // 一开始遇到左括号,都是直接入栈
stack.push(ch2);
} else { // 分类:一开始直接是右括号,匹配一对,得一分; 如果遇到是数字,开始计算深度
if (ch2.equals(")")) {//这里要加以判断栈顶是否为(,才能匹配
if(stack.peek().equals("(")) {
stack.pop();
stack.push("1");
}else { //逻辑是找到第一对之后才有机会有,进入了此状态后,才有后边的计算,☆☆☆找到第一对 是后边的情况发生前提
int depth = 0;
String tmp_top = stack.pop();
while (!("(".equals(tmp_top))) {
depth += Integer.parseInt(tmp_top);
tmp_top = stack.pop();
}
// 跳出循环,说明是遇到左括号了
// stack.pop(); 跳出时就pop() 掉了
stack.push(Integer.toString(2 * depth));
}
}
}
}
int sum = 0;
while (!stack.empty()) {
sum += Integer.parseInt(stack.pop());
}
return sum;
}
}