Я пытаюсь найти все возможные анаграммы строки в Java. Под этим я подразумеваю, что если у меня есть длинное слово длиной 4 символа, я хочу, чтобы все возможные 3 символа длинных слов, полученных из него , все 2 символа длинны и все 1 символ длинный. Самый простой способ - использовать две вложенные петли и итерацию над строкой. Это мой код, как сейчас:Найти все возможные поднаборы с заданной строкой
private ArrayList<String> subsets(String word){
ArrayList<String> s = new ArrayList<String>();
int length = word.length();
for (int c=0; c<length; c++){
for (int i=0; i<length-c; i++){
String sub = word.substring(c, c+i+1);
System.out.println(sub);
//if (!s.contains(sub) && sub!=null)
s.add(sub);
}
}
//java.util.Collections.sort(s, new MyComparator());
//System.out.println(s.toString());
return s;
}
Моя проблема заключается в том, что она работает на 3-х букв слова, fun
yelds этот результат (не обращайте внимания на порядок, слово обрабатывается так, что у меня есть строка с буквы в алфавитном порядке):
f
fn
fnu
n
nu
u
Но когда я пытаюсь 4 букв слова, оно оставляет что-то, как и в catq
дает мне:
a
ac
acq
acqt
c
cq
cqt
q
qt
t
т.е. я не s ee длинное слово длиной 3 символа act
- это тот, который я ищу при тестировании этого метода. Я не могу понять, в чем проблема, и это, скорее всего, логическая ошибка, которую я создаю при создании подстрок. Если кто-нибудь может мне помочь, пожалуйста, не дайте мне код для этого, а скорее аргументы за ваше решение. Это часть курсовой работы, и я должен сам придумать код.
EDIT: чтобы очистить что-то, для меня ПОЛ, ККА, CAQ, AQC, ВКА ЧАС и т.д., то же самое - Для того, чтобы сделать его еще более очевидным, что происходит в том, что строка получает сортируются в алфавитном порядке порядок, поэтому все эти перестановки должны появиться как один уникальный результат, acq. Таким образом, мне не нужны все перестановки строки, а, скорее, с длинной строкой длиной 4 символа, все 3-символьные длинные, которые я могу извлечь из нее, - это означает, что выбирая по одному символу за раз и возвращая эту строку в результате чего это делается для каждого символа в исходной строке. Надеюсь, я поставил свою проблему немного яснее.
Это очень похоже на поиск [power set] (http://en.wikipedia.org/wiki/Power_set). Существует множество алгоритмов поиска силовых установок, вы должны изучить это. –
Не работает и для 3-х. У вас есть «fn», но не «fu» –
Просто общий совет: пошаговая отладка может быть очень полезна для таких логических ошибок. – runDOSrun