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