今日のTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。
小文字のみからなるstrが与えられる。このとき二つの文字列x、yを返すようにせよ。ただし、x、yは次の条件を満たす。
- xとyをくっつけるとstrになる
- x中の"a"の数と、y中の"b"の数は等しい
- 複数のx、yの候補がある場合は、xの長さが最長になるものを返す
私の解答は以下の通り。
public class EqualSubstrings {
public String[] getSubstrings(String str) {
String[] ret = {"",""};
for( int i=0 ; i<=str.length() ; i++ ){ // i=str.lengthまで検討が必要
String first = str.substring(0,i);
String second = str.substring(i); // 2つの文字列候補を生成
int na = 0;
int nb = 0;
for( int j=0 ; j<first.length() ; j++ ){
if( first.charAt(j) == 'a' ) na++;
}
for( int j=0 ; j<second.length() ; j++){
if( second.charAt(j) == 'b' ) nb++;
}
if( na == nb ){
ret[0] = first;
ret[1] = second;
}
}
return ret;
}
}得点は127.55/250、中央値は約188点、提出者の正解率は約54%と低めの結果に。文字列は先頭から見ていくのではなく、後ろからみた方が高速化できますね。解の候補が複数あるときに、xをできるだけ長くというのですから、後ろから見れば、最初にna==nbとなった時点で、そのほかの解を検討する必要がなくなりますので。

0 件のコメント:
コメントを投稿