このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題についておおまかに説明する。
アルファベットの小文字のみからなる同じ長さの文字列AとBが与えられる。二つの文字の距離というのを、差の絶対値で定義される。文字列AとBの距離はAとBの同じ位置にある文字の距離の和として定義する。例えば"abcd"と"bcda"の距離は6となる(aとbの距離は1、dとaの距離は3などとして求められる)。Aの文字のうち、K文字を変えなければならない。このとき、AとBの文字の距離を最小値を返せ。
私の解答はこちら。
import java.util.Arrays;
public class ChangingString {
public int distance(String A, String B, int K) {
int[] diff = new int[A.length()];
int dist = 0;
// ひとまず1文字ごとに距離計算
for( int i=0 ; i<A.length() ; i++ ){
diff[i] = Math.abs(A.charAt(i)-B.charAt(i));
}
Arrays.sort(diff);
// 距離の大きい方からK個の値を変更
for( int i=0 ; i<K ; i++ ){
int idx = diff.length-i-1;
if( diff[idx] > 0 ){
diff[idx] = 0;
}else{
diff[idx] = 1;
}
}
// 距離の合計を計算
for( int i=0 ; i<diff.length ; i++ ){
dist += diff[i];
}
return dist;
}
}得点は241.67/250、中央値は約196点。距離の大きさで順に並び替えて、大きい方からK個の距離を0にすればよい。もし、距離の大きいK個の値に0が含まれていたら、それは1とすればよい。Aの文字をK個強制的に変えなければならないので、0のままではダメということである。
0 件のコメント:
コメントを投稿