牛客网这一题的题干如下:
输入描述:
输入包括一个合法的括号序列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:
其实这里输入的字符 只包含左右括号字符, 而且, 里面必然都是 合法的括号序列, 刚开始我以为题目的意思是包含但不仅限于 合法的括号序列.
如此一来, 我们只要数左括号的序列不就够了?
但是仔细读一下定义, 我们先考虑下括号和括号之间会出现两种情况—嵌套/并列
然后 我们可以总结下会出现以下几种情形:
- 空串 “”
- 仅有嵌套关系 “(())”
- 仅有并列关系 “()()”
- 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);
}
}
合法的括号序列这一特点实在是很适合作为理解栈的操作的实体化.