3

如果您能在 Java 中帮助我解决这个问题,我将不胜感激。

给定两个字符串,假设String A = "(A+B)+(C)"and String B = "((A+B)+(C))"and String C = (A+B)and String D = A+(B+C)andString E = (A+(B+C))

如何确定字符串是否完全被括号包围,如字符串 B。

例如:boolean flag(String expr) { //return false if surrounded, else true }

如果expr = A, flag 将返回 true

如果expr = B, flag 将返回 false

如果expr = C, flag 将返回 false

如果expr = D, flag 将返回 true

如果expr = E, flag 将返回 flase

抱歉,如果不清楚,但它应该适用于任何 String 表达式:

假设表达式仅包含DigitsOperatorsParenthesis

谢谢。欣赏它。

4

3 回答 3

4

您不能使用正则表达式*,因为嵌套括号不是常规语言。

而是遍历字符串并通过计算左括号和右括号的数量来跟踪嵌套级别。为每个左括号添加一个到嵌套级别。对于每个右括号减一。

  • 如果在到达字符串末尾之前达到零(或更少),则返回 true。
  • 如果最后达到零,则返回 false。
  • 其他任何内容都是不平衡的括号,除非您的输入无效,否则不应发生。

以下是一些演示该原理的工作示例:

(A+B)+(C)
11110        TRUE

((A+B)+(C))
12222112210  FALSE

(A+B)
11110        FALSE

A+(B+C)
0            TRUE

(A+(B+C))
111222210    FALSE

*理智地

于 2012-04-08T19:07:28.550 回答
1

我在您的情况下看到了 2 个选项。

  1. 使用子串方法

例子:

public boolean checkForParanthesis(String str) {
 Integer last = str.length() - 1; // Get number of the last character
 String firstChar = str.substring(0); // Get first character of the string
 String lastChar = str.substring(last); // Get last character of the string
 if (firstChar.equals("(") && lastChar.equals(")")) return false;
 return true
}
  1. 使用正则表达式。也许这是一个更好的解决方案。
于 2012-04-08T19:19:18.623 回答
1

Mark Byers 的算法似乎大致就是您正在寻找的。现在把它放在一起,你必须使用Java 关键字forif索引。一个示例可能是以下代码。但是,它不会验证表达式,因此在A+B)测试无效表达式时不会引发错误(仅true返回值)。检查并自己测试。希望这个对你有帮助...


package test;

public class Main {

  public static void main(String[] args) {
    Main m = new Main();
    m.start();
  }

  private void start() {
    /* true */
    System.out.println(isNotSurrounded("A"));
    System.out.println(isNotSurrounded("A+B"));
    System.out.println(isNotSurrounded("A+(B+C)"));
    System.out.println(isNotSurrounded("(B+C)+D"));
    System.out.println(isNotSurrounded("A+(B+C)+D"));
    System.out.println(isNotSurrounded("(A+B)+(C)"));
    System.out.println(isNotSurrounded("(A)+(B)+(C)"));
    System.out.println(isNotSurrounded("(A)+((B)+(C))+(D+E+F+(G))"));
    /* false */
    System.out.println();
    System.out.println(isNotSurrounded("(A)"));
    System.out.println(isNotSurrounded("(A+B)"));
    System.out.println(isNotSurrounded("(A+(B+C))"));
    System.out.println(isNotSurrounded("((B+C)+D)"));
    System.out.println(isNotSurrounded("(A+(B+C)+D)"));
    System.out.println(isNotSurrounded("((A+B)+(C))"));
    System.out.println(isNotSurrounded("((A)+(B)+(C))"));
    System.out.println(isNotSurrounded("((A)+((B)+(C))+(D+E+F+(G)))"));
  }

  private boolean isNotSurrounded(String expression) {
    if (expression.startsWith("(") && expression.endsWith(")") && expression.length() > 2) {
      int p = 0;
      for (int i = 1; i < expression.length() - 1; i++) {
        if (expression.charAt(i) == '(') {
          p++;
        } else if (expression.charAt(i) == ')') {
          p--;
        }
        if (p < 0) {
          return true;
        }
      }
      if (p == 0) {
        return false;
      }
    }
    return true;
  }
}

代码输出如下:


true
true
true
true
true
true
true
true

false
false
false
false
false
false
false
false

于 2012-04-08T20:42:50.580 回答