Алгоритм поиска Rabin-Karp работает нормально, но может ли кто-нибудь помочь мне изменить его на рекурсивный поиск? http://algs4.cs.princeton.edu/53substring/RabinKarp.java.html. Например:Алгоритм поиска строк, который возвращает рекурсивные соответствия - Java
* **pattern:** rar
* **text:** abacadabrararbracabrarararacadabrabrarbracad
* **match1:** rar
* **match2:** rar
* **match3:** rar
* **match4:** rar
* **match5:** rar
* **match5:** rar
Есть другой более быстрый алгоритм для рекурсивного поиска текста соответствия?
РЕШЕНИЕ
Добавить внешнюю библиотеку из http://johannburkard.de/software/stringsearch/ построить путь. Код ниже вернет все начальные позиции совпадений. включая встроенные, такие как match1 и match2.
import com.eaio.stringsearch.BNDM;
String pattern = "rar";
String text = "abacadabrararbracabrarararacadabrabrarbracad";
// Loop through text to get starting position of matched pattern.
List<Integer> matchPoint =new ArrayList<Integer>();
int slice = -1;
while (slice<text.length()){
slice+=1;
com.eaio.stringsearch.BNDM result = new BNDM();
int pos = result.searchString(text, slice, pattern);
if (pos != -1) {
slice = pos;
matchPoint.add(pos);
}
}
У вас есть опыт преобразования итеративного кода в рекурсивный код, для общего случая? –
nope, обычно я просто помещаю 'pattern' в функцию и вызываю поиск до тех пор, пока функция не ответит на конец' text' – alvas
Ну, вы немного в правильном направлении. Идея состоит в том, чтобы разбить проблему на то, что одна итерация решает две или более проблемы, а затем решает проблему с другим рекурсивным вызовом. Это основной принцип. –