この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 件のコメント:
コメントを投稿