题目信息
给定一个平衡括号字符串 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();
}