Мне дан набор строк под названием «словарь», хранящийся в виде поля, представляющего словарь слов.
Я должен написать метод, который принимает параметр String («фразу») и возвращает набор, содержащий все слова в наборе словарей, которые могут быть сделаны путем перестановки символов в данной фразе. В основном я ищу в словаре анаграммы.
Вот мой код:
public Set<String> getWords(String phrase) {
Set<String> anagrams = new TreeSet<String>();
String chosen = "";
anagrams.addAll(getWords(phrase, chosen));
return anagrams;
}
public Set<String> getWords(String phrase, String chosen) {
if (phrase == null) {
throw new IllegalArgumentException();
}
Set<String> anagrams = new TreeSet<String>();
if (dictionary.contains(chosen)) {
anagrams.add(chosen);
anagrams.addAll(getWords(phrase, chosen));
} else {
for (int i = 0; i < phrase.length(); i++) {
String ch = phrase.substring(i, i + 1);
String temp = phrase.substring(0, i) + phrase.substring(i + 1);
anagrams.addAll(getWords(temp, chosen + ch));
}
}
return anagrams;
}
Так что мой подход заключается в следующем:
1. Проверьте словарь на предмет возможности, переданной в этой теме, представленной переменной «selected».
- Если словарь содержит такую возможность, добавьте его в набор, называемый «анаграммы», который возвращается в конце вызова. Затем пропустите возможность снова попытаться сделать из нее другие комбинации.
3 .. Если словарь не содержит возможности, измените строку, чтобы попробовать другие возможности, которые затем проверяются рекурсивно.
Приведенный выше код выдает «ошибку переполнения стека», что, как показывает мое исследование, означает, что я выполняю бесконечную рекурсию или повторяю одну и ту же строку снова и снова бесконечно. Хотя я не вижу, где я это делаю. Вы можете?