あなたの質問の詳細の多くは、入力仕様に関連していますが、これはすべて非常に些細なことです。
入力を解析すると、「候補」の単語 (すべての単語) のリストと、それを表すことができる文字セットへの数字のマッピングが得られます。
List<String> words;
Map<Character, Set<Character>> digitMapping;
数字の単語を生成する最も簡単な方法は、おそらく次のとおりです。候補のリストを順次フィルタリングし、入力数字と一致するかどうかをテストし、一致しない場合は削除します。このような何かがうまくいくかもしれません(この疑似コードを考えてください-私はそれをコンパイルしようとはしていません):
List<String> getMatches(String inputDigits) {
// Take a copy of the word list. You don't want to ruin the list for the next caller
List<String> candidates = new ArrayList<String>(words);
for (Iterator<String> it = candidates.iterator(); it.hasNext() && !candidats.isEmpty(); ) {
String candidate = it.getNext();
for (int i = 0; i < inputDigits.length; ++i) {
Character c = new Character(candidate.charAt(i));
Character d = new Character(inputDigits.charAt(i));
if (!digitMapping.get(d).contains(c)) {
it.remove();
}
}
}
return candidates;
}
一致するすべての単語が返されるため、この例では、「555」は空のリストを返す可能性があります。「6182703」は「ファッション」という 1 つの単語のみを返す場合がありますが、「202」はリスト内の複数の単語 (「犬」、「豚」、「神」) を返す場合があります。ゼロおよび複数のケースをどのように処理するかを決定する必要があります。
編集: digitMapping の入力に関する詳細:
digitMapping は次のようになります。
Map<Character, Set<Character>> digitMapping = new HashMap<Character, Set<Character>>();
次に、入力から char と String を取得する必要があります。入力行「1 akl」の場合、文字は「1」になり、文字列は「akl」になります。文字から文字列内の文字セットにマッピングしているため、空のセットを作成してマップに入れ、セットに入力する必要があります。次のようなものです(繰り返しますが、これをコンパイルしようとさえしていないので、塩の粒でそれを取ってください):
private void addDigitToMap(char digit, String chars) {
Set<Character> set = new HashSet<Character>();
digitMapping.put(set);
for (char c : chars.toCharArray()) {
set.add(new Character(c));
}
}
したがって、マップには、マップを表すことができる一連の文字を指すエントリが含まれます。