小学生都能看懂的题解 | #有效括号序列#

有效括号序列

https://www.nowcoder.com/practice/37548e94a270412c8b9fb85643c8ccc2

方案解释:

想象你有一堆不同形状的积木块,它们分别是圆圈 (、方块 { 和三角形 [ 这些开积木,以及它们对应的闭合积木 )}]

你的任务是检查这些积木能否正确地拼接起来。规则是:

  • 开积木必须先放好,然后才能放对应的闭合积木。
  • 圆圈开积木 ( 必须对应圆圈闭合积木 )
  • 方块开积木 { 必须对应方块闭合积木 }
  • 三角形开积木 [ 必须对应三角形闭合积木 ]

如果所有的积木都能按照这样的规则正确地配对放好,那么就认为这些积木是可以合法拼接的。否则,就不合法。

如何解决:

我们可以用一个“神奇盒子”(在编程中叫栈)来帮助我们检查。这个盒子只能从顶部放积木和拿积木。

  1. 遇到开积木时:
  2. 直接放到“神奇盒子”里。
  3. 遇到闭合积木时:
  4. 先检查“神奇盒子”里是否有积木,如果没有,那说明之前没有合适的开积木,直接告诉它是不合法的。
  5. 如果有积木,就从“神奇盒子”顶部拿出一个积木,看看它们是否是一对(比如 ( 和 ))。
  6. 如果不是一对,也是不合法的。
  7. 最后检查:
  8. 如果“神奇盒子”是空的,那就说明所有的积木都找到了合适的伙伴,是合法的;
  9. 如果还有积木留在“神奇盒子”里,那就是不合法的。

代码解释:

现在让我们用简单的语言解释一下这段代码:

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(); // “神奇盒子”是空的,合法
    }

}

示例:

对于字符串 "[]"

  • 第一个是 [,是开积木,放到“神奇盒子”里。
  • 第二个是 ],是闭合积木,从“神奇盒子”里拿出 [,它们是一对,合法。

对于字符串 "["

  • 第一个是 [,是开积木,放到“神奇盒子”里。
  • 没有闭合积木来配对 [,所以不合法。

如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。

#牛客创作赏金赛#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务