带你读《图解算法小抄》十七、栈(7)https://developer.aliyun.com/article/1348071?groupCode=tech_library
9.括号的得分
给定一个括号字符串S,按照以下规则计算字符串的得分:
"()" 得 1 分。
"(A)" 得 2 * A 分,其中 A 是一个有效的括号字符串。
"AB" 得 A + B 分,其中 A 和 B 是有效的括号字符串。
计算并返回括号字符串S的得分。
示例:
输入:S = "()" 输出:1 解释:括号字符串"()"的得分为1。
输入:S = "(())" 输出:2 解释:括号字符串"(())"的得分为2。
输入:S = "()()" 输出:2 解释:括号字符串"()()"的得分为2。
输入:S = "(()(()))" 输出:6 解释:括号字符串"(()(()))"的得分为6。
1)题目分析与解题步骤:
这个问题可以使用栈来解决。我们可以遍历括号字符串中的每个字符,并使用栈来模拟计算得分的过程。对于每个字符,我们根据其特点和栈的状态进行判断和操作,以计算最终得分。
解题步骤如下:
创建一个栈stack,用于模拟计算得分的过程。
遍历括号字符串S中的每个字符,并执行以下操作:
如果当前字符是左括号(,将其入栈。
如果当前字符是右括号),则说明遇到了一个有效的括号组合。根据题目规则,我们需要计算得分。
如果栈顶元素是左括号(,说明遇到的是一个空的括号对(),此时将1入栈。
如果栈顶元素不是左括号(,说明遇到的是一个有效的括号组合(A),此时需要计算得分。从栈顶开始弹出元素,直到遇到左括号为止。将弹出的元素累加起来,并将累加结果乘以2,得到新的得分,然后将新得分入栈。
当遍历完整个字符串后,栈中的元素即为最终得分。
将栈中的元素按照顺序累加起来,得到最终得分。
返回最终得分作为解答。
2)JavaScript解题框架:
function scoreOfParentheses(S) { let stack = new Stack(); for (let char of S) { if (char === '(') { stack.push(char); } else if (char === ')') { if (stack.peek() === '(') { stack.pop(); stack.push(1); } else { let score = 0; while (stack.peek() !== '(') { score += stack.pop(); } stack.pop(); stack.push(score * 2); } } } let result = 0; while (!stack.isEmpty()) { result += stack.pop(); } return result; }
在这个框架中,我们首先定义了一个栈类Stack,其中包含了常用的栈操作方法。然后,我们使用栈来计算括号字符串的得分。
在scoreOfParentheses函数中,我们遍历括号字符串S,并根据括号的类型和栈的状态进行判断和操作,以计算得分。
最后,将栈中的元素累加起来,得到最终得分,并返回作为解答。
带你读《图解算法小抄》十七、栈(9)https://developer.aliyun.com/article/1348069?groupCode=tech_library