给定一个平衡括号字符串 S
,按下述规则计算该字符串的分数:
()
得 1 分。AB
得A + B
分,其中 A 和 B 是平衡括号字符串。(A)
得2 * A
分,其中 A 是平衡括号字符串。
示例 1:
输入: "()" 输出: 1
示例 2:
输入: "(())" 输出: 2
示例 3:
输入: "()()" 输出: 2
示例 4:
输入: "(()(()))" 输出: 6
基本思路:
- 维护一个栈和一个数组,栈中用来存放‘(’的位置,数组中用来存放其对应位置的值。
- 把每一个‘(’的位置,也就是其在S中的下标,存在栈中,当来了一个‘)’时,取出栈顶的‘(’的下标,将从栈顶‘(’的下标开始到‘)’的位置之间的所有Value的值相加,存在Value的‘)’的位置。
- 相加过的位置全部置0;
- 最后相加整个Value数组即可。
class Solution {
public:
int scoreOfParentheses(string S) {
int Len = S.size(), Res = 0;;
stack<int> Hash;
vector<int> Value(Len, 0);
for (int i = 0; i < S.size(); i++) {
int Sum = 0;
if (S[i] == '(')
Hash.push(i);
else {
for (int n = Hash.top(); n < i; n++) {
Sum += Value[n];
Value[n] = 0;
}
Hash.pop();
Sum *= 2;
Value[i] = Sum == 0 ? 1 : Sum;
}
}
for (int n : Value) Res += n;
return Res;
}
};