面对理解以下算法解决方案的问题

Facing problems understanding the following algorithm solution

我是 Hacker Rank 的新手,我目前正在解决 java 堆栈中的问题,我试图解决这个算法:

如果满足以下条件,则只包含括号的字符串是平衡的:1.如果它是一个空字符串2.如果A和B正确,则AB正确,3.如果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 方法需要 2 个参数(正则表达式、替换); 你需要了解正则表达式:

\ 表示开头是什么。 (\) 开头必须是 '(' 结尾必须是 ')' 以及它们之间的任何内容,以便从正则表达式中休息。

解决方案是用空字符串替换正则表达式。

所以如果你的 input = (1,2)3( 它将在替换 3(

之后

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

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

在平衡字符串上,在平衡字符串上,这最终会通过从内到外移除空对来生成空字符串。让我们看一个例子:

[{()}]()[{}]
  ^^  ^^ ^^  <- 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,并且它 returns 下一个字符串的长度。

最后,比较两个长度。如果相等,则循环终止,因为没有更多的东西可以被替换。如果不相等,则表示删除了一些匹配对,我们将进行另一次迭代,现在使用新值input

最后,我们只检查结果字符串是否为空:

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