Вам необходимо внедрить какой-то вид возврата или другой метод поиска.Я бы предложил следующий подход:
- Создайте таблицу переводов с шифра на символ.Первоначально каждый шифр (цифра) отображается в 0 (ничего).
- Обработка ввода.Каждый раз, когда вы сталкиваетесь с неназначенной цифрой, у вас есть выбор букв на основе словаря и того, что было определено до сих пор.Если нет назначаемых букв, вернитесь назад (или сообщите об ошибке любым способом, который имеет смысл для вашей техники поиска).Добавьте каждый выбор в свою логику управления поиском.(Например, если вы используете возвратный путь, сохраните список вариантов и запишите произвольный выбор в таблице перевода. Если вы вернетесь к этой точке, назначьте другой выбор.)
- Продолжайте, пока не доберетесь доконец или у вас закончились выборы.
РЕДАКТИРОВАТЬ: На шаге 2 сложная часть определяет, какие буквы (если таковые имеются) могут быть назначены следующей цифре шифра.Предположим, что мы отслеживаем декодированное текущее слово и хотим обработать следующую цифру шифра в слове.У нас уже есть глобальная карта присвоений цифр.Логика может выглядеть примерно так (в псевдокоде Java-ish):
Set assignableLetters(String wordSoFar, int nextCipher) {
Character assignment = map.get(nextCipher);
Set set = new Set();
if (assignment != null) {
// The next cipher is already assigned. Add the assignment to the
// return set only if it is compatible with the dictionary contents
if (dictionary.hasWordsWithPrefix(wordSoFar + assignment)) {
set.add(assignment);
}
} else {
// The next cipher is not assigned. We will return a set of all
// compatible characters that can be assigned to it.
for (Character c : unassignedCharacters()) {
if (dictionary.hasWordsWithPrefix(wordSoFar + c)) {
set.add(c);
}
}
}
return set;
}
Если при этом возвращается пустой набор, текущее назначение (до вызова метода) несовместимо со словарем, и поиск долженотступаться.В противном случае поиск должен выбрать одно назначение за раз из набора и продолжить, при необходимости возвращая обратно.
Вместо того, чтобы пытаться использовать каждый неназначенный символ и спрашивать в словаре, совместим ли он, он может быть более эффективным (но логическиэквивалентно) напрямую запросить в словаре список совместимых следующих символов и пересечь его с набором неназначенных символов.