ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

856_括号的分数

2021-12-19 23:33:12  阅读:135  来源: 互联网

标签:分数 tmp 856 遇到 pop 括号 push stack


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;
    }
    
}

 

标签:分数,tmp,856,遇到,pop,括号,push,stack
来源: https://www.cnblogs.com/shan333/p/15709120.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有