描述

一个合法的括号匹配序列有以下定义:
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);

牛客网简单题型练习第四弹相关推荐

  1. 牛客网简单题型练习第三弹

    代码示例: Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();//按照非数字分割成数组 ah19iswm22 ...

  2. 华为机试在线训练--牛客网(python)第四部分

    华为机试在线训练–牛客网(python) 第四部分(31~40) 第三十一题:[中级]单词倒排 题目描述 对字符串中的所有单词进行倒排. 说明: 1.每个单词是以26个大写或小写英文字母构成: 2.非 ...

  3. (python)牛客网(华为机试四)——较难

    本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化. 其他题解合集: (python)牛客网(华为机试一)--入门 (python)牛客网(华为机试二)--简单 (p ...

  4. 牛客网——简单排序(lower_bound( ))

    链接:https://ac.nowcoder.com/acm/contest/547/F 来源:牛客网 题目描述 LXK有一个序列,从N~1,但是他不小心把序列打乱了,现在他想找你把这串序列复原. 他 ...

  5. 牛客网 栈的压入、弹出序列

    链接:https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106 来源:牛客网 [编程题]栈的压入.弹出序列 ...

  6. 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)

    题意 现在我们想要在n步这样的神奇异或操作之内让数组当中的所有元素全部相等,请问这一点是否可能呢?首先输出YES或NO,表示是否有解.如果有解输出需要操作的步数,以及对应选择的元素下标. 样例 在第一 ...

  7. IC笔试牛客网verilog刷题总结四

    47.格雷码计数器 reg [3:0] bin_out;wire [3:0] gray_wire;//格雷码转二进制always@(posedge clk or negedge rst_n)begin ...

  8. 牛客网项目——前置技术(四):项目调试技巧

    文章目录 1. 响应状态码的含义 1.1 官方网站 1.2 常见返回码 2. 服务端断点调试技巧 3. 客户端断点调试技巧 4. 设置日志级别,并将日志输出到不同的终端 4.1 test下创建Logg ...

  9. 【牛客网刷题】VL1 四选一多路器

最新文章

  1. buildConfigField 使用
  2. LINUX任务(jobs)详解
  3. Linux系统目录结构及主要内容
  4. 安利几款语音识别软件
  5. endnote 参考文献加序号_EndNote上手 | 毕业写论文利器
  6. PrintStream 打印流、System 剖析、Java 16 进制转换
  7. 大容量内存的电脑提速技巧
  8. 矩阵分析(三):矩阵的列空间、行空间与零空间
  9. 简单的全局异常统一处理
  10. 中国人保为闲人谷中药科技承保产品责任险,为消费者保驾护航!
  11. 完美解决Windows 7更新失败(Windows Update 错误 80070003)
  12. 鸿蒙系统红米可以升级吗,小米、红米手机能刷鸿蒙系统吗?小米红米刷鸿蒙系统教程...
  13. 【日常点滴016】python游戏库arcade结合Tiled map editor地图编辑器和Pymunk物理引擎制作游戏过程记录,并最终打包为exe文件
  14. excel 多列内容合并为一个单元格
  15. Twitter账号老被封?一文教会你怎么养号
  16. 删除了windows系统的EFI分区导致无法开机的解决方法
  17. Mega软件操作教程
  18. 应用层 万维网WWW
  19. NLP相关知识点问答总结(三)
  20. OS-实现一个RR调度算法

热门文章

  1. Python图片转字符画,太好玩啦(46)
  2. linux命令 final,shell 命令大全先贴一下FinalShell程序的官方网
  3. 六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
  4. 国密算法 + MySQL
  5. 【开店宝典】Lazada怎么入驻?
  6. Java并发:乐观锁
  7. 前端vue--用HbuilderX将小程序打包为h5项目
  8. 单细胞测序数据之标准分析
  9. MYZR IMX6 EK200 RTL8188EUS WIFI AP
  10. A herf=# 的问题