7-4 括号的分数
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
- () 得 1 分。
- AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
- (A) 得 2 * A 分,其中 A 是平衡括号字符串。
输入格式:
输入一行,作为要求处理的字符串 S。
输出格式:
在一行中输出该字符串的分数。
输入样例:
在这里给出一组输入。例如:
()()
输出样例:
在这里给出相应的输出。例如:
2
输入样例2:
在这里给出一组输入。例如:
(())
输出样例2:
在这里给出相应的输出。例如:
2
提示:
- S 是平衡括号字符串,且只含有 ( 和 ) 。
- 2 <= S.length <= 50
参考答案
#include <iostream>
#include <string>
#include <stack>
int score_of_parentheses(const std::string& S) {
std::stack<int> stack;
for (char c : S) {
if (c == '(') {
stack.push(-1); // 使用-1表示'('
} else {
int current = 0;
if (stack.top() == -1) { // 当栈顶是'('时
stack.pop(); // 弹出'('
stack.push(1); // 压入分数1
} else {
// 如果栈顶是分数,累加所有分数直到遇到'('
while (stack.top() != -1) {
current += stack.top();
stack.pop();
}
stack.pop(); // 弹出'('
stack.push(2 * current); // 压入2倍的累加分数
}
}
}
// 最后累加栈中所有分数
int total = 0;
while (!stack.empty()) {
total += stack.top();
stack.pop();
}
return total;
}
int main() {
std::string S;
std::getline(std::cin, S); // 从标准输入读取字符串S
std::cout << score_of_parentheses(S) << std::endl; // 输出括号字符串的分数
return 0;
}