2012年4月5日木曜日

TopCoder SRM361 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題についておおまかに説明する。

テキストエディタのテキスト検索を実装する必要がある。引数のtextは検索対象である。searchは検索したい単語である。wholeWordというのはオプションで"Y"であれば、単語全体がsearchに完全一致(前後は空白あるいは終端で区切られている)、"N"であれば単語の一部は一致でもOKということになる。startというのは、検索の開始位置(0から単語長-1)である。検索が一致した位置を返すメソッドを作成せよ。検索では大文字・小文字は違うものとして扱うことに注意せよ。位置はtextの先頭を0文字目として、初めて一致した箇所の先頭文字の位置を返すことになる。もし一致する位置がない場合は-1を返すようにせよ。

私の解答はこちら。

public class SearchBox {

 public int find(String text, String search, String wholeWord, int start) {
  if( wholeWord.equals("N") ){ // 単語の完全一致でない場合
   return text.indexOf(search, start);
  }

  int from = start;
  while( true ){
   int pos = text.indexOf(search, from); // 第2引数に探索開始位置
   if( pos == -1 ) return -1; // 見つからない場合
   // 見つかった場合
   // 直前の文字の位置
   int prev = pos == 0 ? -1 : pos-1;
   // 直後の文字の位置
   int next = pos+search.length() == text.length() ? -1 : pos+search.length();
   // 直前と直後の文字の内容が空白あるいは前後の端かを考慮して
   // 完全一致を判定
   if( ((prev >= 0 && text.charAt(prev) == ' ') || prev==-1 )
    && ((next >= 0 && text.charAt(next) == ' ') || next==-1 )) return pos;
   from = pos+1; // 単語が完全一致しなかったので、検索の位置を先に進める
  }
 }

}

得点は104.85/250、中央値は約102点。3回目のsubmitでシステムテストクリア。2回失敗して中央値より上なので難しめだったのでしょう。当日の正解率は約25%でした。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計