您问题中的很多细节都与输入规范有关,这都是微不足道的。
解析输入后,您将获得“候选”单词(所有单词)的列表,以及数字到可以表示的字符集的映射。
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”可能只返回一个单词“fashion”,而“202”可能会返回一个列表中的几个单词(“dog”、“hog”、“god”)。您需要决定如何处理零个案例和多个案例。
编辑:有关填充 digitMapping 的详细信息:
digitMapping 将类似于:
Map<Character, Set<Character>> digitMapping = new HashMap<Character, Set<Character>>();
然后你需要从输入中获取一个字符和一个字符串。对于输入行“1 akl”,您的 char 将为“1”,而您的 String 将为“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));
}
}
所以现在地图将有一个条目指向一组可以表示的字符。