このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。
単語の各文字について、出現形式が1つの列からなる場合に限り、単語はまとめられているという。言い換えれば、1つ以上の文字が2ヶ所に分かれて出現しないということである。例えば、"code"はまとめられているといえるが、"aabbbccb"はbが2ヶ所に現れているので、まとめられているとは言わない。さて、words[]という文字列型配列が与えられたとき、そのなかでまとめられている文字列の数を返すメソッドを作成せよ。
私の解答はこちら。
import java.util.ArrayList;
public class GroupedWordChecker {
public int howMany(String[] words) {
int nGrouped = 0;
ArrayList<Character> al = new ArrayList<Character>();
for( int i=0 ; i<words.length ; i++ ){
char lastChar = words[i].charAt(0); // 直前の文字
boolean isGrouped = true;
al.add(lastChar);
for( int j=0 ; j<words[i].length() ; j++ ){
char c = words[i].charAt(j); // 現在の文字
if( lastChar == c ) continue;
lastChar = c; // 新しい文字が出てきたと判定
if( al.contains(c) ){ // もし既に登場した文字だったなら「まとめられているとは言えない」
isGrouped = false;
break;
}else{ // 未登場の文字なら出現済み文字として登録
al.add(c);
}
}
if( isGrouped ) nGrouped++;
al.clear(); // 次の単語を判定するためにリストの中身を空にする
}
return nGrouped;
}
}
得点は229.71/250、1回のsubmitでシステムテストクリア。
0 件のコメント:
コメントを投稿