LeetCode856. 括号的分数问题

856. 括号的分数

https://leetcode-cn.com/problems/score-of-parentheses/

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

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

示例 1:

输入: "()"
输出: 1

示例 2:

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

示例 3:

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

示例 4:

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

提示:

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

思路分析:

使用栈完成该题的求解,我们以示例4为例:

首先我们定义一个栈结构:元素为String类型

存放的策略:

  • 如果是左括号:我们选择直接将其放到栈中
  • 如果是右括号:我们判断栈顶元素是否为左括号
    • 如果是,将栈顶的左括号pop出来,存放一个1进去
    • 如果不是,则将里面的元素和计算出来,最后将左括号pop出来,将元素和 * 2存放到栈中

最后我们将栈中的元素和全部pop出来相加即得到我们的结果集

代码实现

class Solution {
    public int scoreOfParentheses(String s) {
        //定义一个栈结构
        Deque<String> stack = new LinkedList<>();
        for(int i = 0; i < s.length(); i++) {
            //判断该位置的字符是否为'('
            if(s.charAt(i) == '(') {
                stack.push(String.valueOf(s.charAt(i)));
            }else {
                //此时判断stack栈顶元素是否为数字
                if(!stack.peek().equals("(")) {
                    int temp = 0;
                    while(!stack.peek().equals("(")) {
                        temp += Integer.parseInt(stack.pop());
                    }
                    stack.pop(); //pop出左括号
                    stack.push(String.valueOf(temp * 2));
                }else {
                    //说明是'(',//将右括号pop出来
                    stack.pop();
                    stack.push("1");
                }
            }
        }
        //定义结果集
        int res = 0;
        while(!stack.isEmpty()) {
            res += Integer.parseInt(stack.pop());
        }
        return res;
    }
    
}

你可能感兴趣的:(算法,leetcode,算法)