一起刷力扣之【1614. 括号的最大嵌套深度】

371 阅读2分钟

这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战

题目

如果字符串满足以下条件之一,则可以称之为 有效括号字符串valid parentheses string,可以简写为 VPS):

  • 字符串是一个空字符串 "",或者是一个不为 "("")" 的单字符。

  • 字符串可以写为 ABAB 字符串连接),其中 AB 都是 有效括号字符串

  • 字符串可以写为 (A),其中 A 是一个 有效括号字符串 。 类似地,可以定义任何有效括号字符串 S 的 嵌套深度 depth(S)

  • depth("") = 0

  • depth(C) = 0,其中 C 是单个字符的字符串,且该字符不是 "(" 或者 ")"

  • depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是 有效括号字符串

  • depth("(" + A + ")") = 1 + depth(A),其中 A 是一个 有效括号字符串

例如:"""()()""()(()())" 都是 有效括号字符串(嵌套深度分别为 0、1、2),而 ")(""(()" 都不是 有效括号字符串

给你一个 有效括号字符串 s,返回该字符串的 s 嵌套深度

示例

输入: s = "(1+(2*3)+((8)/4))+1"
输出: 3
解释: 数字 8 在嵌套的 3 层括号中。
输入: s = "(1)+((2))+(((3)))"
输出: 3
输入: s = "1+(2*3)/(2-1)"
输出: 1
输入: s = "1"
输出: 0

提示

  • 1 <= s.length <= 100
  • s 由数字 0-9 和字符 '+''-''*''/''('')' 组成
  • 题目数据保证括号表达式 s有效的括号表达式

解题思路

要统计括号的深度,那么我们就需要将所有计算最深的那一对括号外面有多少层,一个简单的方式是利用栈来保存左括号,计算层数,遇到右括号之后再弹出。

代码实现

class Solution {
    public int maxDepth(String s) {
        Stack<Character> stack = new Stack<>();
        int max = 0;
        
        // 遍历字符串
        for(char c : s.toCharArray()){
            if(c == '('){
                // 左括号入栈
                stack.push(c);
                // 更新最大深度
                max = Math.max(max, stack.size());
            }else if(c == ')'){
                // 右括号出栈
                stack.pop();
            }
        }

        // 返回结果
        return max;
    }
}

栈优化

在上面的例子中,我们可以看出实际上我们只需要计算左括号的数量即可,可以省略掉栈的创建,直接使用一个整数变量来代替也可实现相同的效果。

class Solution {
    public int maxDepth(String s) {
        int max = 0, count = 0;
        for(char c : s.toCharArray()){
            if(c == '('){
                ++count;
                max = Math.max(max, count);
            }else if(c == ')'){
                --count;
            }
        }

        return max;
    }
}