目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
现有一字符串仅由(、)、 {、}、[、 ]六种括号组成。
若字符串满足以下条件之一,则为无效字符串:任一类型的左右括号数量不相等
存在未按正确顺序先左(,后右)闭合的括号,输出括号的最大嵌套深度,若字符串无效则输出0。
0<=字符串长度<=100000
二、输入描述
一个只包括(、)、 {、}、[、 ]的字符串。
三、输出描述
整数,最大的括号深度
输入 | 输出 | 说明 |
---|---|---|
[] | 1 | 有效字符串,最大嵌套深度1 |
[{[]}()] | 3 | 有效字符串,最大嵌套深度3 |
四、解题思路
先明确一点,最大括号深度指的是有效闭合括号的嵌套深度,而不是有效闭合括号的组合数。
- 利用栈的特效;
- 如果是左括号{[(,则加入栈stack,有效深度+1;
- 如果是右括号,则弹出栈顶元素;
- 与当前右括号进行比较;
- 如果匹配,弹出栈顶元素,有效深度-1;
- 如果不匹配,直接返回0;
- 取最大深度max;
- 如果不是有效括号,则输出"input error";
- 遍历完毕后,栈stack为空时,表示所有左右括号都可配对,输出最大深度max即可,否则输出0
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
Stack<Character> stack = new Stack<>();
Character pop;
// 有效深度,最大深度
int deep = 0, max = 0;
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
switch (ch) {
// 如果是左括号{[(,则加入栈stack;
case '{':
case '[':
case '(':
deep++;
stack.add(ch);
break;
// 如果是右括号,则弹出栈顶元素;
case '}':
pop = stack.pop();
if (pop != null && pop == '{') {
deep--;
break;
} else {
System.out.println(0);
return;
}
case ']':
pop = stack.pop();
if (pop != null && pop == '[') {
deep--;
break;
} else {
System.out.println(0);
return;
}
case ')':
pop = stack.pop();
if (pop != null && pop == '(') {
deep--;
break;
} else {
System.out.println(0);
return;
}
default:
// 如果不是有效括号,则输出"input error";
System.out.println("input error");
return;
}
// 取最大深度max
max = Math.max(max, deep);
}
// 遍历完毕后,栈stack为空时,表示所有左右括号都可配对,输出最大深度max即可,否则输出0
if (stack.isEmpty()) {
System.out.println(max);
} else {
System.out.println(0);
}
}
六、效果展示
1、输入
[{()}[{[][]}]{}]
2、输出
4
3、说明
明确一点,最大括号深度指的是有效闭合括号的嵌套深度,而不是有效闭合括号的组合数。
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。