【问题标题】:Java Check Balanced ParenthesesJava 检查平衡括号
【发布时间】:2014-01-16 18:18:12
【问题描述】:

我需要编写一个程序来检查括号是否平衡,我知道该怎么做并且已经实现了。但是,第二部分我遇到了麻烦, "给出一个算法,如果字符串没有正确嵌套和平衡,则返回第一个违规括号在字符串中的位置,即如果发现多余的右括号,则返回其位置;如果左括号太多,则返回第一个多余的左括号的位置。"

我们还没有了解堆栈或正则表达式,所以我无法使用它们。下面是我检查嵌套括号是否平衡的实现。

public static int checkNest(char[] arr) {
    int counter = 0,index = 0;
    for(int i=0; i<arr.length; i++) {
        if(arr[i] == '(')
            counter++;
        else if(arr[i] == ')')
            counter--;
    }
    if(counter == 0)
        index = -1;
    return index;
}

现在不正确的索引总是0,我需要操纵我的代码来正确显示不正确括号的索引。

【问题讨论】:

  • 您现在已准备好执行第二次传递...您需要使用有关不平衡方式的信息开始该传递(即,如果计数器小于 0,则也有许多关闭的括号 - 有太多的打开的括号更好)。
  • ` 计数器--; if(counteri 即当前位置
  • 您是否在查看出口是否打开和关闭括号?
  • 每次您的couner 小于0 - 您都会遇到不平衡的括号
  • 您确定() 的平衡数量足以满足您的需求吗?通常,您需要正确数量的( 之前 )。例如。 ")(" 不应是有效输入。

标签: java


【解决方案1】:

一般情况下,当您有多个括号类型时,您必须使用Stack。你只有一个错误:你应该保持 counter 并在找到一个左括号时增加它,在找到一个关闭的括号时减少它。当计数器在迭代的任何步骤中为负时 - 那么它是不平衡的。

public static boolean isBalanced(String str) {
    Deque<Character> stack = new LinkedList<>();

    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);

        if (ch == '(' || ch == '[' || ch == '{')
            stack.push(ch);
        else {
            if (stack.isEmpty())
                return false;

            char prv = stack.pop();

            if (prv == '(' && ch != ')')
                return false;
            if (prv == '[' && ch != ']')
                return false;
            if (prv == '{' && ch != '}')
                return false;
        }
    }

    return stack.isEmpty();
}

如果你只有一种类型的括号,那么你可能只有一个计数器:

public static boolean isBalanced(String str) {
    int count = 0;

    for (int i = 0; i < str.length() && count >= 0; i++) {
        if (str.charAt(i) == '(')
            count++;
        else if (str.charAt(i) == ')')
            count--;
    }

    return count == 0;
}

【讨论】:

    【解决方案2】:

    对于一个额外的右括号,如果计数器为零,你可以立即返回i的当前值,但是对于一个额外的左括号,你必须继续解析字符串直到结束,所以你必须记住位置最后一个左括号与counter==0:

    public static int checkNest(char[] arr) {
        int counter = 0,index = -1;
        for(int i=0; i<arr.length; i++) {
            if(arr[i] == '(') {
                if (counter == 0) {
                    index = i;
                }
                counter++;
            } else if(arr[i] == ')') {
                if (counter == 0) {
                    return i;
                }
                counter--;
            }
        }
        if (counter == 0) {
            return -1;
        }
        return index;
    }
    

    【讨论】:

      【解决方案3】:
      public static int checkNest(char[] arr) {
          int counter = 0,index = 0;
          for(int i=0; i<arr.length; i++) {
              // Only one incorrect parentheses. 
              index = i;
              if(arr[i] == '(')
                  counter++;
              else if(arr[i] == ')')
                  counter--;
          }
          if(counter == 0)
              index = -1;
          return index;
      }
      

      【讨论】:

      • )( 输入呢?
      • 对不起,我不明白。我认为问题是询问不正确字符的索引。
      猜你喜欢
      • 2020-08-09
      • 2015-05-01
      • 2022-08-13
      • 1970-01-01
      • 2019-01-12
      • 2019-11-01
      • 2011-02-12
      • 1970-01-01
      • 2021-07-07
      相关资源
      最近更新 更多