面对理解以下算法解决方案的问题
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());
我是 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());