周围的括号标识符Java

时间:2012-04-08 19:02:21

标签: java regex string char iteration

如果您能用Java帮助我,我将不胜感激。

给定两个字符串,我们可以说String A = "(A+B)+(C)"String B = "((A+B)+(C))"以及String C = (A+B)String D = A+(B+C)以及String 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表达式:

假设表达式仅包含数字运算符括号

感谢。欣赏它。

3 个答案:

答案 0 :(得分: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

*三立

答案 1 :(得分:1)

我认为你的情况有两种选择。

  1. 使用子字符串方法
  2. 示例:

    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. 使用reqular表达式。也许这是一个更好的解决方案。

答案 2 :(得分:1)

Mark Byers的算法似乎大致正是您所寻找的。现在把它放在一起,你必须使用forif Java关键字和索引。一个例子可以是以下代码。但是,它不验证表达式,因此在例如时不会引发错误。测试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