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;
    }
}
目录
相关文章
|
8月前
|
测试技术
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
|
8月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
69 0
|
4月前
|
存储 C语言 Python
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
671 4
|
7月前
|
存储 人工智能 测试技术
每日练习之字符串——得分
每日练习之字符串——得分
31 0
|
8月前
|
算法 测试技术 C++
【贪心 堆 】3081. 替换字符串中的问号使分数最小
【贪心 堆 】3081. 替换字符串中的问号使分数最小
7-9 字符串循环左移分数
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
79 0
|
8月前
|
算法 测试技术 C#
【数学】 【分数】 【字符串】972. 相等的有理数
【数学】 【分数】 【字符串】972. 相等的有理数
|
存储 索引
信息学奥赛 如何在整数数组中寻找两数之和等于给定目标值
本文介绍了在整数数组中寻找两个数之和等于给定目标值的问题,提供了两种解法:暴力法和哈希表法。通过比较两种解法的时间复杂度,指出了哈希表法更为高效。
129 0
|
8月前
leetcode-856:括号的分数
leetcode-856:括号的分数
45 0
|
存储 算法
算法训练day11|20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值
算法训练day11|20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值