括号的分数|Java 刷题打卡

本文正在参加「Java主题月 – Java 刷题打卡」,详情查看<活动链接>

一、题目描述

括号的分数

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

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

示例 1:

输入: "()"
输出: 1
复制代码

示例 2:

输入: "(())"
输出: 2
复制代码

示例 3:

输入: "()()"
输出: 2
复制代码

示例 4:

输入: "(()(()))"
输出: 6
复制代码

提示:

  1. S是平衡括号字符串,且只含有 ()
  2. 2 <= S.length <= 50

二、思路分析

看到括号类的题目首先想到的就是用栈来解决。

我们可以创建一个栈,遍历给定的字符串,把每个字符都压入栈中。虽然我们是想把括号依次放入栈中,但也不能思想固化,栈中也可以放入其它元素(比如分数)。

如果是(就压入栈中。

如果是)就遍历计算与栈顶元素的分数。

下面以输入(()(()))为例:

  • 第一个括号

01.jpg

  • 第二个括号

02.jpg

  • 第三个括号

03.jpg

  • 第四个括号

04.jpg

  • 第五个括号

05.jpg

  • 第六个括号

06.jpg

  • 第七个括号

07.jpg

  • 第八个括号

08.jpg

在整个过程中,我们只需要遍历一次字符串,所以时间复杂度是O(n),执行用时1ms

三、AC代码

public int scoreOfParentheses(String S) {
        Stack<Integer> stack = new Stack<>();
        for (Character c : S.toCharArray()) {
            if (c == '(') {
                stack.push(-1);
            } else {
                int temp = 0;
                while (stack.peek() != -1) {
                    temp += stack.pop();
                }
                stack.pop();
                stack.push(temp == 0 ? 1 : 2 * temp);
            }
        }
        int res = 0;
        while (!stack.isEmpty()) {
            res += stack.pop();
        }
        return res;
    }
复制代码

四、总结

这道题初看可能有些复杂,会主观的认为需要创建一些变量来标识遍历到的字符串的位置,以及用变量记录得分。但细想解法其实很简单,单纯的使用一个栈就能解决问题。

上面的代码把(看作了-1,以满足栈中全部存放整型元素。其实这也是一个误导,刚开始容易认为(和分数(整型)不是一个类型,所以不能放到同一个栈里。因此把某些内容进行类比也是一种思路。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享