2012年4月4日水曜日

TopCoder SRM358 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題についておおまかに説明する。

循環する単語は円に書くことができる。循環する単語を表すため、任意の開始地点を選び、文字を時計回りに順に読む。つまり、"picture"と"turepic"は同じ循環する単語である。words[]という文字列配列が与えられたとき、その中に何種類の循環する単語が存在するかを返すメソッドを作成せよ。

私の解答はこちら。

import java.util.ArrayList;

public class CyclicWords {

 public int differentCW(String[] words) {
  ArrayList<String> al = new ArrayList<String>();
  for( int i=0 ; i<words.length ; i++ ){
   al.add(words[i]+words[i]);
  }
  boolean[] isUnique = new boolean[al.size()];
  for( int i=0 ; i<isUnique.length ; i++ ){
   isUnique[i] = true;
  }
  for( int i=1 ; i<al.size() ; i++ ){
   for( int j=0 ; j<i ; j++ ){
    String tar = al.get(j);
    int n = tar.indexOf(words[i]);
    // 単語が循環しているかを判定する方法
    // 後半の条件は例えば"aaa"と"aa"の区別のために必要になる
    if( n >= 0 && tar.length() == words[i].length()*2 ){
     isUnique[i] = false;
     break;
    }
   }
  }
  int nUnique = 0;
  for( int i=0 ; i<isUnique.length ; i++ ){
   if( isUnique[i] == true ) nUnique++;
  }
  return nUnique;
 }

}

得点は168.08/250、中央値は約187点。1回のsubmitでシステムテストクリア。2回繰り返した単語を考えることで循環するということを簡単にしている。これにより、ある単語について途中にindexOfで0以上の値があれば、繰り返しとみなすことができる。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計