0017-Caesar Cipher
問題(外部リンク)
実装の概要
問題の制約に「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); } }