返回递归匹配的字符串搜索算法-Java

返回递归匹配的字符串搜索算法-Java,java,algorithm,search,full-text-search,string-search,Java,Algorithm,Search,Full Text Search,String Search,Rabin-Karp搜索算法运行良好,但有人能帮助我将其修改为递归搜索吗。 例如: * **pattern:** rar * **text:** abacadabrararbracabrarararacadabrabrarbracad * **match1:** rar * **match2:** rar * **match3:** rar * **mat

Rabin-Karp搜索算法运行良好,但有人能帮助我将其修改为递归搜索吗。 例如:

 *  **pattern:** rar
 *  **text:**    abacadabrararbracabrarararacadabrabrarbracad 
 *  **match1:**          rar               
 *  **match2:**            rar
 *  **match3:**                     rar
 *  **match4:**                       rar
 *  **match5:**                         rar
 *  **match5:**                                     rar
还有其他更快的递归文本匹配搜索算法吗

解决方案

将外部库从添加到生成路径。下面的代码将返回所有匹配的起始位置。包括嵌入的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);
    }
}
import com.eaio.stringsearch.BNDM;
字符串模式=“rar”;
String text=“ABACADABARARABARABARBRACAD”;
//循环遍历文本以获得匹配图案的起始位置。
List matchPoint=new ArrayList();
int slice=-1;

虽然(slice当然有。我不建议在搜索字符串中的小模式时使用Rabin Karp。KMP即Knuth-Morris-Pratt算法需要线性时间和线性附加内存,并且可以返回所有匹配项,而不会在处理Rabin Karp时发生冲突。请阅读相关说明。此算法是一种更难理解,但代码更短,一旦正确,您会感到非常满意。

对于更长的模式,或类似的变体通常更快。Boyer-Moore算法并不特别适合大型字母表。如果文本可以是完整的Unicode范围,它将使用相当大的移位表,但如果文本s ASCII或latin1,查找表的额外空间很小。对于大字母表,我也建议使用KMP。

您是否有将迭代代码转换为递归代码的经验,对于一般情况,也就是说?不,通常我只需将
模式
放入一个函数中,并调用搜索,直到该函数答复
文本的结尾嗯,你的思路有些正确。这个想法是把一次迭代解决的问题分解成两个或更多的子问题,然后用另一个递归调用来解决这些问题。这是基本原则。我试着在代码中运行这个KMP模块,结果是内存不足问题。还有其他简单但节省内存的方法吗对于字符串搜索的ng方法,我曾尝试过从中使用BNDM,但重新编码的时间有点太长,我的项目说明是保持字符串搜索简单,但不消耗时间/内存。有什么建议吗?这有点麻烦-如果你使用比输入本身占用两倍内存的算法时内存不足(如果模式小于要搜索的字符串,则可能更少)。可能更可能是您的java VM设置不好。现在,我发现我们来自同一所大学,更迫切需要帮助您:P=)Boris,你是来自NTU还是UdS?哈哈哈。我已经让Rabin Karp递归,它也会出现内存不足的问题。我已经通过实现BNDM algo解决了这个问题。但是它仍然没有我使用的API那么快