Учитывая строку, я хочу найти все варианты без транспонирования, только удаление. Например, с учетом строки:Поиск вариантов строки (только удаление, отсутствие транспонирования)
helloo
Список вариантов был бы следующим (разделенный пробелом).
helloo hello heloo helo
Моего решения до сих пор пройти через каждый символ, а затем, если текущий символ соответствует следующему символу, рекурсивно попробовать оригинальный и уничтоженную версию символа, следующим образом.
// takes String with at most two consecutive characters of any character,
// and returns an Iterable of all possible variants (e.g. hheello -> heello, hhello, ...)
private static Iterable<String> findAllVariants(String word) {
StringBuilder variant = new StringBuilder(word);
Queue<String> q = new LinkedList<String>();
findAllVariants(word, variant, 0, q);
return q;
}
// helper method
private static void findAllVariants(String word, StringBuilder variant, int currIndex, Queue<String> q) {
if (currIndex == variant.length() - 1) q.add(variant.toString());
for (int i = currIndex; i < variant.length() - 1; i++) {
char thisChar = variant.charAt(i);
char nextChar = variant.charAt(i+1);
if (thisChar == nextChar) {
// get all variants with repeat character
findAllVariants(word, variant, i+1, q);
// get all variants without repeat character;
variant = variant.deleteCharAt(i);
findAllVariants(word, variant, i, q);
}
}
}
Однако в конечном итоге я получаю большое количество копий ответов, и никто из других. Когда я делаю свой алгоритм на бумаге, это кажется правильным. Что я делаю не так?
Две ноты замешательства в вашем коде: один, где происходит рекурсия? И два, почему вы конвертируете слово в список, а затем перебираете его? Что это делает? – cjspook
Вы правы, термин «рекурсия» был введен, прежде чем я изменил код. Это исправит! Я конвертирую слово в список для первой итерации, после итераций (вложенных циклов) будет больше «опций». Например. ваше слово «hello», в следующих вариантах итерации будет «ello hllo helo hell» (передано как список). Следующая итерация этого цикла будет использоваться для получения всех возможностей в удалении символов из 'ello',' hllo', 'helo',' hell' и т. Д. До тех пор, пока не будут оставлены строки одного символа ('int removeChars') (последняя итерация внешнего цикла). – Aquillo
Интересно, что ваш код лишь частично решает проблему. Кроме того, он не дает набор уникальных результатов, но вместо этого многие повторяются. – cjspook