3

Javaでこれを手伝っていただければ幸いです。

String A = "(A+B)+(C)"2 つの文字列が与えられた場合、andString B = "((A+B)+(C))"およびString C = (A+B)and and とString D = A+(B+C)しましょうString E = (A+(B+C))

文字列が文字列 B のように括弧で完全に囲まれているかどうかを特定するにはどうすればよいですか。

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

の場合expr = A、フラグは true を返します

の場合expr = B、フラグは false を返します

の場合expr = C、フラグは false を返します

の場合expr = D、フラグは true を返します

の場合expr = E、フラグはflaseを返します

明確でない場合は申し訳ありませんが、どの文字列式でも機能するはずです。

式に数字演算子括弧のみが含まれているとします。

ありがとう。感謝します。

4

3 に答える 3

4

ネストされた括弧は正規言語ではないため、正規表現でそれを行うことはできません*。

代わりに、文字列を繰り返し処理し、開き括弧と閉じ括弧の数を数えてネストレベルを追跡します。開き括弧ごとに、ネストレベルに1を追加します。閉じ括弧ごとに1を引きます。

  • 文字列の最後に到達する前にゼロ(またはそれ以下)に達した場合は、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. reqular式を使用します。おそらくそれはより良い解決策です。
于 2012-04-08T19:19:18.623 に答える
1

Mark Byers のアルゴリズムは、大まかにあなたが探しているもののようです。まとめるとforifJava のキーワードとインデックスをいじる必要があります。例として、次のコードがあります。ただし、式は検証されないため、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 に答える