括号的分数

题目信息

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
    () 得 1 分。
    AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
    (A) 得 2 * A 分,其中 A 是平衡括号字符串。
示例1:
    输入: "()"
    输出: 1
示例2:
    输入: "(())"
    输出: 2
示例3:
    输入: "()()"
    输出: 2
示例4:
    输入: "(()(()))"
    输出: 6

提示:
S 是平衡括号字符串,且只含有 ( 和 ) 。
2 <= S.length <= 50

解题思路

如果是(),就为1,如果并列的()()为1+1,如果(())包含的关系则为2*1
主要是还是模拟栈的方式解决,初始化栈顶元素为0,当为左括号时候push一个0元素进栈,
当为右括号时候取栈顶的元素为m,n,此时的值应为n + max(2 * m, 1),取出2 * m 和1中的最大值

代码

// 括号的分数
class Stack {
    private var array = [Int]();
    func pop() -> Int {
        if array.isEmpty {
            return 0;
        }
        return array.removeLast();
    }
    func push(x: Int) -> Void {
        return array.append(x);
    }
}

func scoreOfParentheses(_ S: String) -> Int {
    let stack = Stack();
    stack.push(x: 0);
    for char in S {
        if char == "(" {
            stack.push(x: 0);
        } else {
            let m = stack.pop();
            let n = stack.pop();
            stack.push(x: n + max(2 * m, 1));
        }
    }
    return stack.pop();
}

题目链接

原文地址:https://www.cnblogs.com/muzichenyu/p/12809300.html