我是黑客级别的新手,目前正在解决java堆栈中的问题,我试图解决以下算法:

如果满足以下条件,则仅包含括号的字符串是平衡的:1.如果是空字符串2.如果A是正确的,那么B是正确的.如果A是正确的,(A)和{A}和[A]也是正确的.

一些正确平衡的字符串的示例有:"{}()"、"[{()}]"、"({()})"

一些不平衡字符串的例子有:"{}(","({)}","[[","}{"等.

给定一个字符串,确定它是否平衡.


我发现下面的一行解决方案我不明白有人能解释一下吗?

class Solution{
     public static void main(String []argh)
     {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            String input=sc.next();
            while(input.length() != (input = input.replaceAll("\\(\\)|\\[\\]|\\{\\}", "")).length());
            System.out.println(input.isEmpty());
        }
        
    }
}

推荐答案

replaceAll的字符串"\\(\\)|\\[\\]|\\{\\}"是一个正则表达式.需要一半的反斜杠,因为()[]{}在正则表达式中都有特殊意义;另一半需要避开those个反斜杠,因为\在字符串中也有特殊含义.

忽略反斜杠,模式为()|[]|{},它将匹配子字符串()[]{}中的任何一个.然后,replaceAll调用通过将它们替换为空字符串""来删除所有匹配项.然后重复此操作,直到无法替换更多匹配项.

对于平衡字符串,only对平衡字符串,通过从内到外移除空对,最终生成空字符串.让我们看一个例子:

[{()}]()[{}]
  ^^  ^^ ^^  <- these matches are removed
[{}][]
 ^^ ^^ <- then these are removed
[]
^^ <- and finally this one

while循环的编写方式上还有一些混淆:

while(input.length() != (input = input.replaceAll(...)).length());

要理解这一点,您需要知道=执行赋值,但也计算为赋值.你需要知道Java always evaluates subexpressions from left to right.

首先,计算input.length(),得到原始字符串的长度.然后计算(input = input.replaceAll(...)).length(),它做两件事:将下一个字符串分配给input,并返回下一个字符串的长度.

最后,对两种长度进行了比较.如果相等,则循环终止,因为无法替换更多内容.如果不相等,这意味着一些匹配对已被删除,我们将进行另一次迭代,现在新值为input.

最后,我们只需判断结果字符串是否为空:

System.out.println(input.isEmpty());

Java相关问答推荐

在Keycloak测试容器中的测试之间清理数据库

长音符

ActivityCompat.请求收件箱自动拒绝权限

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

确定Java中Math.Ranb()输出的上限

如何找到MongoDB文档并进行本地化?

内存中的H2修剪尾随空格

由于 list 中的权限错误,Android未生成

有没有更快的方法在N个容器中删除重复项?

MySQL数据库中未应用具有Spring数据的唯一约束

Java中将文本拆分为数字或十进制数字和字符串

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

Java中不兼容的泛型类型

垃圾回收器是否真的删除超出作用域的对象?

如何以编程方式保存workBench.xmi?

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

视图被推出线性布局-Android

Bash数组的单引号元素并使用空格连接

当我try 返回可选时,Mock无法正常工作

Java 21保护模式的穷尽性