持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
题目描述
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。 AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。 (A) 得 2 * A 分,其中 A 是平衡括号字符串。
示例 1:
输入: "()"
输出: 1
示例 2:
输入: "(())"
输出: 2
示例 3:
输入: "()()"
输出: 2
示例 4:
输入: "(()(()))"
输出: 6
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/score-of-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的算法题目字符串处理题目,具体的类型是括号处理题目,在括号处理题目中,我们最常使用栈这种数据结构来解决问题。
- 栈的性质是LIFO(last in first out), 栈既有 Stack 这种实现好的数据结构,有时候也可以使用数组模拟实现。栈还有一种常见的用法是单调栈,就是从栈顶读出来一个元素,该元素满足单调性。比如:取出栈中的最小值。
- 具体到这个题目,本题要求的是括号的分数。为了求解方便,我们适当的做一些转换,把 ( 定义为 0。遇到 ) 出栈。从例子来看,"(())" 输出 2。 "()"输出1。也可以转化为解括号深度的问题,需要注意的是,括号有嵌套关系的时候,数值需要翻倍,才能计算正确。具体实现代码如下,供参考:
通过代码
class Solution {
public int scoreOfParentheses(String s) {
Stack<Integer> stack = new Stack<>();
for (char ch : s.toCharArray()) {
if (ch == '(') {
stack.push(0);
} else {
if (stack.peek() == 0) {
stack.pop();
stack.push(1);
} else {
int temp = 0;
while(stack.peek() != 0){
temp += stack.pop();
}
stack.pop();
stack.push(2 * temp);
}
}
}
int ans = 0;
while(!stack.isEmpty()){
ans += stack.pop();
}
return ans;
}
}
总结
- 上述算法的时间复杂度是O(n),空间复杂度是O(n)。
- 栈是一种非常常见的数据结构,我们好好掌握!坚持算法每日一题,加油!