给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
1、 () 得 1 分。
2、 AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。3、 (A) 得 2 * A 分,其中 A 是平衡括号字符串。
思路1:用栈模拟
Go代码如下:
/*
( () ( () ))
[0]
[0, 0]
[0, 1]
[0, 1, 0]
[0, 1, 0, 0]
[0, 1, 0, 1]
[0, 1, 2]
[6]
*/
func scoreOfParentheses(S string) int {
length := len(S)
if length < 2 {return 0}
var stack []int
for i := 0; i < length; i++ {
if S[i] == '(' { // 遇到左括号,则用0标识,然后入站
stack = append(stack, 0)
} else { // 如果遇到别的
if stack[len(stack)- 1] == 0 { // 如果栈顶是左括号,则弹出左括号,存进去1
stack[len(stack) - 1] = 1
} else { // 如果遇到别的,而且栈顶不是左括号
k, j, tmp := 0, len(stack) - 1, 0
for c := stack[j]; c != 0; { // temp把栈顶顶值都存下来
tmp += c
j--
k++
c = stack[j]
}
stack = append(stack[:len(stack) - 1 - k], tmp << 1) // 重点
tmp = 0
}
}
}
sum := 0
for _, v := range stack {
sum += v
}
return sum
}
思路2: 计数
func scoreOfParentheses(s string) int {
ans, d := 0, 0
for i, c := range s {
if c == '(' {
d++
} else {
d--
if s[i-1] == '(' {
ans += 1 << d
}
}
}
return ans
}
图片来自 【爪哇缪斯】图解LeetCodehttps://leetcode.cn/problems/score-of-parentheses/solution/zhua-wa-mou-si-by-muse-77-hy72/
这道题很难受。