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