括号匹配深度 与 栈的使用

牛客网这一题的题干如下:

输入描述:
输入包括一个合法的括号序列s,s长度length(2 ≤ length ≤ 50),序列中只包含’(‘和’)’。

输出描述:
输出一个正整数,即这个序列的深度。

然后我们再来看下对于"合法的括号序列"的定义

1、空串"“是一个合法的括号匹配序列
2、如果"X"和"Y"都是合法的括号匹配序列,“XY"也是一个合法的括号匹配序列
3、如果"X"是一个合法的括号匹配序列,那么”(X)“也是一个合法的括号匹配序列
4、每个合法的括号序列都可以由以上规则生成。
例如: “”,”()”,"()()","((()))“都是合法的括号序列
对于一个合法的括号序列我们又有以下定义它的深度:
1、空串”“的深度是0
2、如果字符串"X"的深度是x,字符串"Y"的深度是y,那么字符串"XY"的深度为max(x,y) 3、如果"X"的深度是x,那么字符串”(X)"的深度是x+1
例如: "()()()“的深度是1,”((()))"的深度是3。牛牛现在给你一个合法的括号序列,需要你计算出其深度。

这段描述还是比较清楚的, 直白点概括就是—左右括号能闭合的字符串

这一题, 读题很重要, 最开始我没有理解输入字符串的特殊性导致走了很多弯路, 看完题解后突然发现难度从4降都了2:
其实这里输入的字符 只包含左右括号字符, 而且, 里面必然都是 合法的括号序列, 刚开始我以为题目的意思是包含但不仅限于 合法的括号序列.

如此一来, 我们只要数左括号的序列不就够了?
但是仔细读一下定义, 我们先考虑下括号和括号之间会出现两种情况—嵌套/并列
然后 我们可以总结下会出现以下几种情形:

  1. 空串 “”
  2. 仅有嵌套关系 “(())”
  3. 仅有并列关系 “()()”
  4. 2和3的结合体, 嵌套和并列并存 “(()())”

以上已经涵盖了定义中的符合的括号现象.
如果仅计算左括号数, 我们可以解决123情况, 也就是说我们需要特殊考虑的就是情况4.
解决这个问题, 则需要用到栈的思想, 不断将左括号推入栈中, 然后每次遇到一个右括号从栈中弹出一个左括号, 以此删除左侧并列关系的括号, 从而使每次计算左括号次数都只包含当前串联关系的左括号数量.
代码表示如下:

import java.util.Stack;
public class demo {
    public static void main(String[] args) {
        String str = "((()())";
        int maxVal = 0;
        Stack<Character> st = new Stack<>();
        for(int i = 0; i<str.length(); i++){
            char c = str.charAt(i);
            if('(' == c){
                st.push(c);
                maxVal = Math.max(maxVal, st.size());
            }
            if(')' == c){
                st.pop();
            }
        }
        System.out.println(maxVal);
    }
}

合法的括号序列这一特点实在是很适合作为理解栈的操作的实体化.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值