为什么不能使用换码符替换所有的括号?
我试图取代他们背对支架为我采取解决上Hackerrank.com编码挑战的所有方括号中here.为什么不能使用换码符替换所有的括号?
我觉得有一个解决的挑战,但我似乎无法得到替换所有功能,以正常工作我的功能。我试过使用Pattern.quote(String)
以及反斜杠,但由于某些原因,我的括号没有被替换。
public class Solution {
public static boolean isBalanced(String expression) {
if(expression.length() %2 != 0) {
return false;
}
else {
int middle = expression.length() /2;
String open = expression.substring(0,middle);
String close = expression.substring(middle);
close.replaceAll("\\)", "\\(");
close.replaceAll(Pattern.quote("}"),"{");
close.replaceAll(Pattern.quote("]"), "[");
new StringBuilder(close).reverse().toString();
if(close.equals(open))
return true;
else
return false;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
for (int a0 = 0; a0 < t; a0++) {
String expression = in.next();
System.out.println((isBalanced(expression)) ? "YES" : "NO");
}
}
}
编辑:我测试了打印语句的代码行后new StringBuilder(close).reverse().toString();
输入:
3
{[()]}
{[(])}
{{[[(())]]}
输出:
)]}
NO
])}
NO
))]]}}
NO
String
Java中的对象是不可变的,因此在其中执行替换命令不会更改源String
,而是返回已修改的新String
。
让你的线条像这样
close.replaceAll("\\)", "\\(");
,而不是像这样
close = close.replaceAll("\\)", "\\(");
与修改String
对象更新close
变量的值。
同样,String
这里创建被分配给了什么和将被丢弃:
new StringBuilder(close).reverse().toString();
您需要分配创建String
地方,例如
close = new StringBuilder(close).reverse().toString();
我不敢相信我犯了这样一个愚蠢的错误。感谢您的支持! – Remixt
您的解决方案是根本错误的,因为它容易出现误报。
具体来说,这个字符串会产生"YES"
,而串显然是不平衡的:
[({{(]
后你劈成两半,你将有"[({"
和"{(]"
的字符串。在关闭部分替换字符后,您将有"{(["
,在逆转后变为"[({"
。转换的结果与字符串的前半部分相匹配,所以你的代码会错误地推断字符串中的括号是匹配的。
感谢您挑战挑战!我仍然想知道为什么我的代码在任何情况下都不会返回true。 – Remixt
我使用打印语句对其进行了测试。字符串根本不会改变。 – Remixt