所以我正在尝试学习 Java,但我被困在一个任务上。该作业要求类似于弦是否平衡,带有奇怪的扭曲。只有当所有开括号都在闭括号之前,它才能返回真。
真的:
((()))
(())
()
错误的:
()()
(())()
我已经编写了一个普通的“检查是否平衡”,但我不明白如何添加这个小扭曲。我真的只掌握了基础知识,所以我不太了解数组之类的东西,非常感谢帮助。
可能不是最好的解决方案,但从您提供的示例来看,这可行
String pattern = "((((()))))";
char matcher = '(';
int count = 0;
for (char c : pattern.toCharArray()) {
if (c == matcher) count++;
}
for (int i = 0; i < pattern.length(); i++) {
if (pattern.charAt(i) == ')' && i < count) {
System.out.println("UNBALANCED");
}
}
这仅适用于您所说的扭曲。您可能希望将正则表达式用于这样的事情。
您可以使用 Java 模式匹配!
String test1 = "((()))";
String test2 = "()";
System.out.println(test1.matches("\\(+\\)+")); // Should Return True
System.out.println(test2.matches("\\(+\\)+")); // Should Return True
String test3 = "()()";
String test4 = "(())()";
System.out.println(test3.matches("\\(+\\)+")); // Should Return False
System.out.println(test4.matches("\\(+\\)+")); // Should Return False
解释正则表达式“\(+\)+”。首先你需要使用“\(+”来检测它何时打开,+表示一个或多个。然后你需要使用“\)+”来检测它何时关闭。我使用 \ 的原因是因为您需要转义(和),因为它们是 java 模式中的构造,您只希望它们是字符串中的普通字符。
使用 ArrayDeque。
在 try 块中,当您遇到左括号时,将它们推到顶部。当你遇到右括号时,每次从 Deque 中弹出一个元素。如果右侧括号太多或它们在左侧括号之前出现,您将收到 NoSuchElementException 并且您知道约束已失败。捕获异常并返回 false。如果到达字符串的末尾并且 ArrayDeque 不为空(括号未全部关闭),则返回 false。否则返回真。