856_括号的分数

简介: 856_括号的分数

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;
    }
}
目录
相关文章
|
3月前
|
人工智能
PTA-查找满足条件的所有整数
查找满足条件的所有整数
41 1
|
3月前
|
测试技术
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
|
2月前
|
存储 人工智能 测试技术
每日练习之字符串——得分
每日练习之字符串——得分
14 0
|
3月前
|
算法 测试技术 C++
【贪心 堆 】3081. 替换字符串中的问号使分数最小
【贪心 堆 】3081. 替换字符串中的问号使分数最小
|
3月前
|
算法 测试技术 C#
【数学】 【分数】 【字符串】972. 相等的有理数
【数学】 【分数】 【字符串】972. 相等的有理数
|
3月前
|
Java C++ Python
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
42 0
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
7-9 字符串循环左移分数
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
57 0
|
3月前
leetcode-856:括号的分数
leetcode-856:括号的分数
24 0
|
12月前
|
存储 算法
算法训练day11|20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值
算法训练day11|20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值
|
存储 算法
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下: (1+2)\3 而这对于计算机进行求取结果来说,并不是一个最优的方案。
100 0