题目
题目描述
一个合法的括号匹配序列有以下定义:
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
输入:(())(((())))
输出:4
分析
- 判断括号序列是否合法,在之前一篇博文已经提到过算法—添加括号问题
- 计算括号深度需要两个变量:depth和maxdepth,depth用来记录当前深度,maxdepth记录当前最大深度;
- 遇到左括号,depth++,然后判断maxdepth与depth的大小,若depth>maxdepth,则将depth赋值给maxdepth;遇到右括号,depth- -
- 最后,若括号不合法,则返回-1;合法则返回深度:maxdepth
为了方便理解,画出了代码运行过程图如下:
代码
import java.util.Scanner;
public class Main{
public static int getDepth(String s){
int leftnum = 0; //左括号数目
int rightnum = 0; //右括号数目
int depth = 0; //记录当前深度
int maxdepth = 0; //记录最大深度
for(int i=0; i<s.length(); i++){
if(s.charAt(i) == '('){
leftnum++;
depth++;
if(depth > maxdepth){
maxdepth = depth;
}
}else{
depth--;
if(leftnum == 0){
rightnum++;
}else{
leftnum--;
}
}
}
if(leftnum+rightnum != 0){
return -1; //不合法
}
return maxdepth;
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int depth = getDepth(str);
if(depth == -1){
System.out.print("括号序列不合法");
}else{
System.out.print(depth);
}
sc.close();
}
}