2017-03-24 3 views
1

このコードは、指定された接頭辞および接尾辞を持つリスト(ソートされたカスタム配列リスト)の要素の数を返します。それは動作しますが、log(n)+ kのコストがかかります。ここで、kはリスト内でその接頭辞を持つ文字列の数です。とにかくそれをより効率的かつ高速にするには?.get()および.size()のみを使用して、順序付きArrayListで部分一致をカウントします。

//StringList,custom ArrayList only contains size() and get() 
public int countMatches(StringList a, String prefix, String suffix) { 

    int count = 0; 

    for (int i = 0; i < a.size(); i++) { 
     String temp = a.get(i); 
     if (temp.startsWith(prefix) && temp.endsWith(suffix)) { 
      count++; 
     } 
    } 
    return count; 
} 

更新: これは、コードでバイナリ検索は最初の接頭辞を発見した後、コードは接頭辞を持たない単語を取り除くことになっています。しかし、それは動作しません、どのように来るのですか?

 for (int i = low; i < high; i++) { 

      if (!(prefix.compareTo(a.get(i)) > 0)) { 
       high = i; 
       break; 
      } 
     } 
+1

リストを最初から最後まで直線的に検索するのではなく、log(n)の元になるバイナリ検索を実行してください。 – Sentry

+0

問題は、文字列でバイナリ検索を実装する方法です。 – foritsvoid

+0

ソートされたリスト/配列のバイナリ検索と同じように実装します。 [Wikipedia](https://en.wikipedia.org/wiki/Binary_search_algorithm)を参照してください。あなたは検索アルゴリズムについて尋ねていますか?または、あなたが['String.compareTo(String)'](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String - )作品ですか? – Andreas

答えて

5

リストがソートされている場合は、binary searchを実行して接頭辞で始まる最初の文字列を見つけることができます。

+0

申し訳ありませんが、コードははるかに優れていますが、今では接尾辞に問題があります。 – foritsvoid

+0

バイナリ検索で見つかった位置からリストをたどって、リストに要素がなくなるか、positionの文字列が接頭辞で始まり、文字列が接尾辞で終わる場合はカウンタをインクリメントします。 – Farrandu

+0

サンプルコードを教えてください。これは以前の回答のおかげで本当に役に立ちました。 – foritsvoid

関連する問題