【LeetCode】括号的分数Java题解

152 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

题目描述

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:

() 得 1 分。 AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。 (A) 得 2 * A 分,其中 A 是平衡括号字符串。

示例 1:

输入: "()"
输出: 1
示例 2:

输入: "(())"
输出: 2
示例 3:

输入: "()()"
输出: 2
示例 4:

输入: "(()(()))"
输出: 6


来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/score-of-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目字符串处理题目,具体的类型是括号处理题目,在括号处理题目中,我们最常使用栈这种数据结构来解决问题。
  • 栈的性质是LIFO(last in first out), 栈既有 Stack 这种实现好的数据结构,有时候也可以使用数组模拟实现。栈还有一种常见的用法是单调栈,就是从栈顶读出来一个元素,该元素满足单调性。比如:取出栈中的最小值。
  • 具体到这个题目,本题要求的是括号的分数。为了求解方便,我们适当的做一些转换,把 ( 定义为 0。遇到 ) 出栈。从例子来看,"(())" 输出 2。 "()"输出1。也可以转化为解括号深度的问题,需要注意的是,括号有嵌套关系的时候,数值需要翻倍,才能计算正确。具体实现代码如下,供参考:

通过代码

class Solution {
    public int scoreOfParentheses(String s) {
        Stack<Integer> stack = new Stack<>();
        for (char ch : s.toCharArray()) {
            if (ch == '(') {
                stack.push(0);
            } else {
                if (stack.peek() == 0) {
                    stack.pop();
                    stack.push(1);
                } else {
                    int temp = 0;
                    while(stack.peek() != 0){
                        temp += stack.pop();
                    }
                    stack.pop();
                    stack.push(2 * temp);
                }
            }
        }

        int ans = 0;
        while(!stack.isEmpty()){
            ans += stack.pop();
        }
        return ans;
    }
}

image.png

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)。
  • 栈是一种非常常见的数据结构,我们好好掌握!坚持算法每日一题,加油!