【问题标题】:How to check if parentheses are balanced (with a twist)如何检查括号是否平衡(扭曲)
【发布时间】:2016-01-19 01:24:09
【问题描述】:

所以我正在努力学习 Java,但我被困在了一项任务上。该作业要求类似于弦是否平衡,带有奇怪的扭曲。只有在所有开括号都在闭括号之前,它才能返回 true。

正确:

((()))

(())

()

错误:

()()

(())()

我已经编写了一个普通的“检查是否平衡”,但我不明白如何添加这个小扭曲。我真的只掌握了基础知识,所以我不太了解数组之类的东西,不胜感激。

【问题讨论】:

标签: java string balance


【解决方案1】:

可能不是最好的解决方案,但从您提供的示例来看,这是可行的

   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");
       }
   }

这只是为了你所说的扭曲。您可能希望将正则表达式用于这样的事情。

【讨论】:

    【解决方案2】:

    您可以使用 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 模式中的构造,您只希望它们是字符串中的普通字符。

    【讨论】:

      【解决方案3】:

      使用 ArrayDeque。

      在 try 块中,当您遇到左括号时,将它们推到顶部。当你遇到右括号时,每次从 Deque 中弹出一个元素。如果右侧括号太多或它们在左侧括号之前出现,您将收到 NoSuchElementException 并且您知道约束已失败。捕获异常并返回 false。如果到达字符串的末尾并且 ArrayDeque 不为空(括号未全部关闭),则返回 false。否则返回真。

      【讨论】:

        猜你喜欢
        • 2019-11-01
        • 2022-08-13
        • 2018-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        • 2017-06-10
        • 2011-11-04
        相关资源
        最近更新 更多