刷题的日常-括号的分数

107 阅读2分钟

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

刷题的日常-2022年10月9号

一天一题,保持脑子清爽

括号的分数

来自leetcode的 856 题,题意如下:

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

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

示例1:

输入: "()"
输出: 1

示例2:

输入: "(())"
输出: 2

示例3:

输入: "()()"
输出: 2

理解题意

我们可以从题意中提取的条件如下:

  • 题目给出一个字符串
  • 要求我们根据规则计算出括号的得分
    • 如果出现 (),得一分
    • 如果出现两个括号阔在一起,得 2 * 子括号得分
    • 如果交替出现,则相加

做题思路

这里直接采用暴力模拟得方法:

  • 开辟一个栈进行保存当前结果,如果是 (,直接压栈
  • 如果是 ),需要弹出栈顶元素,规则如下
    • 如果栈顶的元素是数字,则需要乘以2,然后再弹出 ( 括号
    • 如果栈顶的元素是 (,则当前为 1
    • 栈顶元素弹出之后,需要判断之前的数是不是数值,如果是的话还需要将数值加上去
  • 最后将栈里面的数相加返回即可

代码实现

代码实现如下:


public class Solution {
    S<Pair> nums;
    public int scoreOfParentheses(String s) {
        nums = new S<>(s.length());
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == ')') {
                Pair pop = nums.pop();
                if (pop.isNum) {
                    pop.num *= 2;
                    while (!nums.isEmpty() && nums.peek().isNum) {
                        pop.num += nums.pop().num;
                    }
                    if (!nums.isEmpty()) {
                        nums.pop();
                    }
                } else {
                    pop.num = 1;
                }
                while (!nums.isEmpty() && nums.peek().isNum) {
                    pop.num += nums.pop().num;
                }
                pop.isNum = true;
                nums.push(pop);
                continue;
            }
            nums.push(new Pair());
        }
        int result = nums.pop().num;

        while (!nums.isEmpty()) {
            result += nums.pop().num;
        }
        return result;
    }
}

class Pair { boolean isNum;int num;}

class S<T> {
    int idx = -1;
    Object[] stack;
    public S(int maxSize) {stack = new Object[maxSize];}
    boolean isEmpty() {return idx == -1;}
    boolean isFull() {return idx == stack.length;}
    boolean push(Object num) {if (isFull()) {return false;}stack[++idx] = num;return true;}
    T pop() {return (T) stack[idx--];}
    T peek() {return (T) stack[idx];}
}

2f7640f196a79b289456a99139f7892.jpg