gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:54:51 27 4
gpt4 key购买 nike

我是 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 的字符串 "\\(\\)|\\[\\]|\\{\\}" 是一个正则表达式。需要一半的反斜杠,因为所有 ()[]{} 在正则表达式中都有特殊含义;另一半需要转义 那些 反斜杠,因为 \ 在字符串中也有特殊含义。

忽略反斜杠,模式为 ()|[]|{},它将匹配任何子字符串 ()[]{}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,然后返回下一个字符串的长度。

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

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

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

关于java - 面对理解以下算法解决方案的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71691301/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com