2011-07-06 13 views
-2

よくあるシーケンスをJavaの文字列で見つける方法はありますか?文字列内の一般的なシーケンスを見つける

文字列は長い数字列で、よく出現する数字のシーケンスを探したいと思っています。

+1

"1111"の結果は何ですか? –

+0

私は1x1111,2x113、3x11と思います。しかし、それは本当に問題ではない、私は最も一般的なシーケンスを見つける必要があります。 – Veriton

答えて

2

私は、あなたが探している順序がどれくらいあるかによって決まると思います。

Guava Multisetを使用してシーケンスを反復し、すべてのサブシーケンスをMultisetに書き込み、オカレンスでソートします。ここではサンプル実装です:

public static String getMostFrequentSequence(final String input, final int patternLength) { 
    final Multiset<String> multiset = HashMultiset.create(); 
    final int length = patternLength < 0 ? input.length() : Math.min(patternLength, input.length()); 
    for (int l = 2; l < length; l++) { 
     for (int o = 0; o < input.length() - l; o++) { 
      multiset.add(input.substring(o, o + l)); 
     } 
    } 
    return Ordering.from(new Comparator<Entry<String>>() { 
     public int compare(final Entry<String> o1, final Entry<String> o2) { 
      return 
      ComparisonChain.start() 
      .compare(o1.getCount(), o2.getCount()) 
      .compare(o1.getElement(), o2.getElement()) 
      .result(); 
     } 
    }).max(multiset.entrySet()).getElement(); 
} 

とパフォーマンスについて:私は

public static void main(final String[] args) throws Exception { 
    final StringBuilder sb = new StringBuilder(); 
    final Random random = new Random(); 
    for (int i = 0; i < 1000; i++) { 
     sb.append(random.nextInt(10)); 
    } 
    final long t1 = System.currentTimeMillis(); 
    final String input = sb.toString(); 
    System.out.println(input); 
    System.out.println(getMostFrequentSequence(input, -1)); 
    System.out.println(System.currentTimeMillis() - t1); 
    final long t2 = System.currentTimeMillis(); 
    System.out.println(getMostFrequentSequence(input, 12)); 
    System.out.println(System.currentTimeMillis() - t2); 
} 
+0

私は最高のカウントが2桁の数字であると思います。この方法を使用すると、長い文字列を使用する必要はありません。文字列がランダムである場合はesp。 ;) –

+0

@Peter私は知っていますが、これらのように曖昧な仕様で何をすべきですか? :-) –

+0

+1:面白い解決策と努力のために。 IMHOは、同じ長さの文字列を比較する唯一の意味があります。 –

1

12文字までのパターンの長さを制限する場合は、この試験方法は、無制限の長さのための私のマシン上秒〜約25ミリ秒程度かかり与えられた長さの数字をArrayListに入れ、ソートして重複数を数えます(それらは互いに隣り合っています)。

関連する問題