合法括号满足的条件为左边第一个括号必须为( 其次满足(个数等于)个数,这样称为合法括号
例如:() ((())) (()())
了解了合法括号之后,先来看第一个 合法括号的深度问题
例题1
对于一个合法的括号序列我们又有以下定义它的深度:
1、空串””的深度是0
2、如果字符串”X”的深度是x,字符串”Y”的深度是y,那么字符串”XY”的深度为max(x,y) 3、如果”X”的深度是x,那么字符串”(X)”的深度是x+1
例如: “()()()”的深度是1,”((()))”的深度是3。牛牛现在给你一个合法的括号序列,需要你计算出其深度。
解题思路:
遍历这个串,创建一个基数 一个层次最大值 如果是左括号,基数++同时比对之前层次最大值,如果大于就赋值给层次最大值,如果是右括号 基数–,这样在最后就可以保证我们获得的层次最大值是最大的。
import java.util.Scanner;
//括号匹配深度
public class Main3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String S = scanner.next();
int index = 0;
int result= 0;
for (int i = 0; i < S.length(); i++) {
if(S.charAt(i) == '('){
index ++;
result = Math.max(index,result);
}else{
index--;
}
}
System.out.println(result);
}
}
例题2 合法括号匹配方案个数
1. 移除序列s中第一个左括号
2. 移除序列s中任意一个右括号.保证操作之后s还是一个合法的括号序列
东东现在想知道使用上述的移除操作有多少种方案可以把序列s变为空
如果两个方案中有一次移除操作移除的是不同的右括号就认为是不同的方案。
例如: s = “()()()()()”,输出1, 因为每次都只能选择被移除的左括号所相邻的右括号.
s = “(((())))”,输出24, 第一次有4种情况, 第二次有3种情况, … ,依次类推, 4 * 3 * 2 * 1 = 24
这道题其实是上一道题的变种,在上一道题的基础上从求整体的层次问题,变为了求局部层次的问题,我们通过上一题知道了,整体的层次就是所有局部层次中最大值,而这道题就可以省去那部分操作 解题思路可以分为以下几点:
1.求出局部层次
2.进行递减求积
可能有些疑问,为什么要递减求积,这里用到排列的内容,可以理解为如果局部层次为2的话,2个左括号和右边的括号有几种排列方式的问题 也就是A(2,2) = 2! = 1×2
代码如下:
import java.util.Scanner;
//括号有多少种组合方式。
public class Main2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String S = scanner.next();
int index = 0;
int result = 1;
for (int i = 0; i < S.length(); i++) {
if(S.charAt(i) == '('){
index ++;
}else{
result *= index;
index--;
}
}
System.out.println(result);
}
}