I♥TLE

Java、オンラインジャッジなど

0017-Caesar Cipher

問題(外部リンク)

Caesar Cipher | Aizu Online Judge

実装の概要

問題の制約に「thisかthatかtheのいずれかを含む」と書いてあるので、若干強引ではありますが「試しに各文字をiずつずらした文字列を作る」→「前述のキーワードを含むかチェックする」という流れで処理を行います。文字列は短いので十分間に合います。
ソースのような条件で検索しているのは、例えば「thisを含む」という条件にしてしまうとthisで始まる他の単語が入っている場合でも該当してしまうためです(テストケースにあるかは検証していませんが、実際そのような単語は存在します)。そのため、「this(空白)またはthis.」という条件で検索します。

public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         
        while(true){
            String input = br.readLine();
             
            if(input == null){
                break;
            }
             
            System.out.println(Solver.solve(input));
        }
    }
 
}
 
class Solver {
     
    public static String solve(String str){
        char[] inputCharArray = str.toCharArray();
         
        String newString = null;
        for(int i = 0; i < 26; i++){
            newString = makeNewString(inputCharArray, i);
             
            if(newString.contains("this ") || newString.contains("that ") || newString.contains("the ")
                    || newString.contains("this.") || newString.contains("that.") || newString.contains("the.")){
                break;
            }
        }
         
        return newString;
    }
     
    private static String makeNewString(char[] array, int n){
        char [] tmpArray = new char[array.length];
        for(int i = 0; i < array.length ;i++){
            if(Character.isAlphabetic(array[i])){
                tmpArray[i] = (char) (array[i] + n);
                if(tmpArray[i] > 'z'){
                    tmpArray[i] -= 26;
                }
            }
            else {
                tmpArray[i] = array[i];
            }
        }
         
        return new String(tmpArray);
    }
}