856_括号的分数
/** * ★☆ 启发:当参考官网的答案看不懂时,看高赞答案或者评论区,评论区的解释更加清晰,代码的解析更加详细的 */ 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; } }