2012-01-29 22 views
0

文字列を処理するための簡単なクラスを書いています(1milまでの非常に長い文字列かもしれません)。文字列は基本的に2つの文字 "a"と "b"で構成され、互いに混在しています。 aとbの数が等しい場合、アプリはそれ以外の場合はNOKと答えます。私はそれを最も効率的に行う方法を知っています。私は正規表現を使ってStringを分割し、aとbの出現回数を数えることを考えましたが、おそらく誰かがそれを行う良い方法を知っています。比較的新しい正規表現ですので、バグがあれば教えてください。これは私の初期の試みです。文字列中の指定された文字の数を確認してください

public class Typo { 
    public static void main(String[] args){  
     String ver = ""; 
     int na = 0; 
     int nb = 0; 
     String regex = ("\\w.+"); 
     Pattern p = Pattern.compile(regex); 
     String text = "ababababbaba"; 
     if (text.length() == 0){ 
      ver = "OK"; 
     } 
     else if (text.length() == 1){ 
      ver = "NOK"; 
     } 
     else if ((text.length() % 2) == 1){ 
      ver = "NOK"; 
     } 
     else if ((text.length() % 2) == 0){ 
      //check number of a and b and if it equals return OK otherwise NOK 
      Matcher m1 = p.matcher("a"); 
      while(m1.find()){ 
       na = na + 1; 
      } 
      Matcher m2 = p.matcher("b"); 
      while(m2.find()){ 
       nb = nb + 1; 
      } 
      if (na == nb){ 
       ver = "OK"; 
      } 
      else 
       ver = "NOK"; 
     } 
     System.out.println(ver); 
    } 

} 
+2

は、それは文字の上にちょうどループにはるかに容易にし、それぞれの数をカウントしませんか?正規表現の使用がより高速になるとは信じられませんが、これはベンチマークには些細なことです。あなたは? –

+0

現在、私は "abbb"のようなStringに問題があります。また、非常に長い文字列の最適化の問題もあります。 – aretai

+0

@ Dave私は、パフォーマンスが何がより速いかを心配する限りは分かりません。私はv.longの文字列の正規表現が速くなるかもしれないとは思ったが、わからない。どのように私の文字列にそのような繰り返しを実行することをお勧めしますか? – aretai

答えて

3

なぜ正規表現が必要なのか、この文字列を分割するのですか。文字列をループし、aとbの数を数えるだけです。 aとbの2つの異なるカウンタを保持する必要があります。正規表現を使用すると効率が低下します。文字列を少なくとも1回は通過させずに結果を得る方法はありません。したがって、単純なループを使ってaとbを数えます。

  • ループ内で最適化を行うことができます。 countA - countBのanytime modが残りの文字数より大きい場合、aとbは等しくなることはありません。だから、あなたはループを破ることができます。

  • 文字列の長さが奇数の場合、カウントする必要はありません。要素の総数が奇数の場合、aとbの数は等しくなることはありません。

1

この問題にはregexpを使用しないでください。一般に、何かを数える必要がある場合、regexpは良くありません。正規表現を書いて、式の大括弧が平衡しているかどうかを調べることさえできません。

この問題では、単純なカウンターで十分です:aを増やし、bを減らして、問題の答えを知るために最後にゼロを確認してください。

boolean check(String s) { 
    int count = 0; 
    for (int i = 0 ; i != s.length() ; i++) { 
     if (s.charAt(i) == 'a') { 
      count++; 
     } else { /* it is b */ 
      count--; 
     } 
    } 
    return count == 0; 
} 
+0

あなたの入力をありがとう – aretai

1

私は、これはあなたが望むものであると信じて:

private static boolean check(String input) { 
    int count = 0; 
    for (int i = 0; i < input.length(); ++i) { 
     if (input.charAt(i) == 'a') { 
      count++; 
     } 
    } 
    return count == input.length() >> 1; // count == input.length()/2 
} 
1

したい場合は、StringUtilsのようなサードパーティのライブラリを使用することができます。それは仕事をする方法countMatchesを持っています。

StringUtils.countMatches("abba", "a") = 2 
StringUtils.countMatches("abba", "ab") = 1 
+0

あなたはいつも何か新しいことを勉強していただきありがとうございます。 – aretai

+0

はい、いつでもできます。 – RanRag

1

このような単純なものを使用すると何が問題になりますか?これほど簡単なことをやっているあなたのアイデアは過度のものであり、さらに多くのリソースを使用することになります。

String s = "abbb"; 

int a = 0; 
int b = 0; 
for(int i = 0; i<s.length(); i++){ 
    if((s.charAt(i) == 'a')){ 
     a += 1; 
    } else { 
     b += 1; 
    } 
} 

a = 1; b = 3

+0

regexのような新しいsthを試してみたいと思っていましたが、これは処理が速くなると思っていましたが、うまくいきません。 – aretai

1
public class Typo { 
    public static void main(String[] args){  
     String ver = "NOK"; 

     String text = "ababababbaba"; 

     if((text.length() - text.replaceAll("a","").length()) == 
      (text.length() - text.replaceAll("b","").length())) { 
      ver = "OK";  
     } 

     System.out.println(ver); 
    } 
} 
+0

非常に興味深い回答ありがとうございます – aretai

+0

あなたは歓迎です – Nurlan

関連する問題