小学生都能看懂的题解 | #有效括号序列#
有效括号序列
https://www.nowcoder.com/practice/37548e94a270412c8b9fb85643c8ccc2
方案解释:
想象你有一堆不同形状的积木块,它们分别是圆圈 (
、方块 {
和三角形 [
这些开积木,以及它们对应的闭合积木 )
、}
和 ]
。
你的任务是检查这些积木能否正确地拼接起来。规则是:
- 开积木必须先放好,然后才能放对应的闭合积木。
- 圆圈开积木
(
必须对应圆圈闭合积木)
。 - 方块开积木
{
必须对应方块闭合积木}
。 - 三角形开积木
[
必须对应三角形闭合积木]
。
如果所有的积木都能按照这样的规则正确地配对放好,那么就认为这些积木是可以合法拼接的。否则,就不合法。
如何解决:
我们可以用一个“神奇盒子”(在编程中叫栈)来帮助我们检查。这个盒子只能从顶部放积木和拿积木。
- 遇到开积木时:
- 直接放到“神奇盒子”里。
- 遇到闭合积木时:
- 先检查“神奇盒子”里是否有积木,如果没有,那说明之前没有合适的开积木,直接告诉它是不合法的。
- 如果有积木,就从“神奇盒子”顶部拿出一个积木,看看它们是否是一对(比如 ( 和 ))。
- 如果不是一对,也是不合法的。
- 最后检查:
- 如果“神奇盒子”是空的,那就说明所有的积木都找到了合适的伙伴,是合法的;
- 如果还有积木留在“神奇盒子”里,那就是不合法的。
代码解释:
现在让我们用简单的语言解释一下这段代码:
import java.util.Stack; public class BracketValidator { public static boolean isValid(String s) { Stack<Character> stack = new Stack<>(); // 创建一个“神奇盒子” for (char c : s.toCharArray()) { // 逐个检查每个积木 if (c == '(' || c == '{' || c == '[') { // 如果是开积木 stack.push(c); // 放到“神奇盒子”里 } else if (c == ')' || c == '}' || c == ']') { // 如果是闭合积木 if (stack.isEmpty()) { // “神奇盒子”是空的吗? return false; // 没有开积木配对,不合法 } char topElement = stack.pop(); // 从“神奇盒子”里拿出一个积木 if ((c == ')' && topElement != '(') || (c == ']' && topElement != '[') || (c == '}' && topElement != '{')) { return false; // 积木配对错误,不合法 } } } return stack.isEmpty(); // “神奇盒子”是空的,合法 } }
示例:
对于字符串 "[]"
:
- 第一个是
[
,是开积木,放到“神奇盒子”里。 - 第二个是
]
,是闭合积木,从“神奇盒子”里拿出[
,它们是一对,合法。
对于字符串 "["
:
- 第一个是
[
,是开积木,放到“神奇盒子”里。 - 没有闭合积木来配对
[
,所以不合法。
如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。
#牛客创作赏金赛#小学生都能看懂的算法 文章被收录于专栏
主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。