牛客网简单题型练习第四弹

该博客介绍了如何计算合法括号序列的深度,通过使用栈的数据结构来处理括号匹配问题。通过对输入的括号序列进行遍历,将左括号入栈,遇到右括号时与栈顶的左括号匹配并出栈,从而计算当前序列的深度。最后通过示例解释了整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

描述

一个合法的括号匹配序列有以下定义:
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。牛牛现在给你一个合法的括号序列,需要你计算出其深度。

输入描述:

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

输出描述:

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

 按我的理解 这题的意思是:

()一个括号 深度为1

(())两个括号 深度为2

((()))三个括号 深度为3

另外还有并列的

()()()深度是1

(()())深度是2

一个括号内嵌几个括号,深度为几

那我们就是写代码 找到左括号有几个 就是其深度

因为它说 会给我们一个合法的括号序列 所以只需要单单只找到左括号 得出正确答案 最后一种情况不符合

那我们只能用到栈了 

栈是 先进后出 后进先出的原则

首先定义一个空的栈

Stack<Character> stack = new Stack<Character>();

需要用到栈的思想, 不断将左括号推入栈中, 然后每次遇到一个右括号从栈中弹出一个左括号, 以此删除左侧并列关系的括号, 从而使每次计算左括号次数都只包含当前串联关系的左括号数量.

代码如下:


        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);
    

charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法。

charAt()方法返回指定索引位置的char值。索引范围为0~length()-1,如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符。

 我们慢慢来看:

首先当我们输入((()()))

str.charAt(i) 在循环i的数值时 依次输出 1.(  2.(  3.(   4. ) 5. (  6 . ) 7. ) 8. )

第一次循环是( 也就是 c=(

然后( ==(   

if( (==( )正确   往下执行

给栈加元素 

st.push(c);

此时 栈 里面就有了一个 左括号 (

继续执行语句:

 maxVal = Math.max(maxVal, st.size());

maxVal我们前面定义了:

int maxVal = 0;

这里我们需要采用的是函数Math.max取得是最大值

Math.max()函数是什么意思呢?

打个比方:

Math.max(1,2) 那取里面的大的值 就是2

多举几个:

Math.max(2,2) 结果是2

Math.max(0,1)结果是1

就是取括号里面的大的值

这样的话如果 括号是平行  的话 我们用此函数   深度就不会重复多加一了

此时,第一次循环maxVal=Math.max(0,1)

所以结果是1

详细说一下 

当我们输入((()()))时

比方说 前面我们已经输入了 三个左括号 那maxVal是3  st.size()是3 深度是3

第四次循环是 )  右括号 那maxVal还是3 st.size()是2  深度是3

第五次循环是 (   左括号 那maxVal还是3 st.size()是3 深度是3

第六次循环是  )   右括号 那maxVal还是3 st.size()是2 深度是3

你看 我们深度没有多加一 这就符合我们 前面说的第四种 平行括号的深度

继续执行 第二次循环 c=(

然后( ==(   

if( (==( )正确   往下执行

给栈加元素 

st.push(c);

此时 栈 里面就有了两个 左括号 (  (

继续执行下一条语句

 maxVal = Math.max(maxVal, st.size());

继续执行语句:

 maxVal = Math.max(maxVal, st.size());

此时,第2次循环maxVal=Math.max(1,2)

所以结果是2

继续执行 第三次循环 c=(

然后( ==(   

if( (==( )正确   往下执行

给栈加元素 

st.push(c);

此时 栈 里面就有了三个 左括号 (  ((

继续执行下一条语句

 maxVal = Math.max(maxVal, st.size());

继续执行语句:

 maxVal = Math.max(maxVal, st.size());

此时,第3次循环maxVal=Math.max(2,3)

所以结果是3

继续执行 第四次循环 c=)

然后第二个if语句  :)=)

if( )==))正确   往下执行

给栈减元素 

st.pop();

那之前栈里是 三个左括号 (((

现在减一个 (

那就是还有两个左括号 ((      此时st.size() 是2 因为有两个括号

继续执行 第五次循环 c=(

然后( ==(   

if( (==( )正确   往下执行

给栈加元素 

st.push(c);

此时 栈 里面就有了三个 左括号 (  ((  此时st.size() 是3 因为有3个括号

继续执行下一条语句

 maxVal = Math.max(maxVal, st.size());

继续执行语句:

 maxVal = Math.max(maxVal, st.size());

此时,第5次循环maxVal=Math.max(3,3)

所以结果是3

继续执行 第六次循环 c=)

然后第二个if语句  :)=)

if( )==))正确   往下执行

给栈减元素 

st.pop();

那之前栈里是 三个左括号 (((

现在减一个 (

那就是还有两个左括号 ((  此时st.size() 是2 因为有两个括号

继续执行 第7次循环 c=)

然后第二个if语句  :)=)

if( )==))正确   往下执行

给栈减元素 

st.pop();

那之前栈里是 2个左括号 ((

现在减一个 (

那就是还有1个左括号 (

继续执行 第8次循环 c=)

然后第二个if语句  :)=)

if( )==))正确   往下执行

给栈减元素 

st.pop();

那之前栈里是 1个左括号 (

现在减一个 (

那就是没有括号啦

结果也出来了

输出  maxVal结果是3

System.out.println(maxVal);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值