Java 克努特–;莫里斯&x2013;普拉特算法

Java 克努特–;莫里斯&x2013;普拉特算法,java,string,Java,String,解决方案是:草堆:aaaaaaaa,针:AAA,哪个是:3,对吗 因为,草堆中有8个AAA实例,但据我所知,knuth-morris-pratt算法只能找到3个。我这样想是不是错了 这个问题可以通过找出字符串中每个后缀的边界来解决吗 以下是我对KMP算法的实现: public static int occurrenceOfSubstring(char[] target, char[] pattern) { int[] overlay = new int[pattern.lengt

解决方案是:草堆:aaaaaaaa,针:AAA,哪个是:3,对吗

因为,草堆中有8个AAA实例,但据我所知,knuth-morris-pratt算法只能找到3个。我这样想是不是错了

这个问题可以通过找出字符串中每个后缀的边界来解决吗

以下是我对KMP算法的实现:

public static int occurrenceOfSubstring(char[] target, char[] pattern) {
        int[] overlay = new int[pattern.length];
        overlay[0] = -1;
        overlay[1] = 0;

        int i = 0, j = 1;

        while (j + 1 < pattern.length) {
            if (pattern[i] == pattern[j]) {
                if (i == 0) {
                    overlay[j + 1] = 1;
                } else {
                    overlay[j + 1] = overlay[j] + 1;
                }
                i++;
                j++;
            } else if (pattern[j] == pattern[0]) {
                i = 0;
            } else {
                j++;
            }
        }

        int l = 0,count=0;

        for (int k = 0; k < target.length; k++) {
            if (target[k] == pattern[l]) {
                if (l == pattern.length - 1) {
                    l = 0;
                    count++;
                } else {
                    l++;
                }
            } else {
                l = overlay[l] == -1 ? 0 : overlay[l];
            }
        }
        return count;
    }
子字符串的公共静态int发生率(char[]目标,char[]模式){ int[]覆盖=新的int[pattern.length]; 叠加[0]=-1; 叠加[1]=0; int i=0,j=1; 而(j+1<模式长度){ if(模式[i]==模式[j]){ 如果(i==0){ 叠加[j+1]=1; }否则{ 叠加[j+1]=叠加[j]+1; } i++; j++; }else if(模式[j]==模式[0]){ i=0; }否则{ j++; } } int l=0,count=0; for(int k=0;kKMP专注于在完全匹配搜索失败时优化搜索,但可以重用部分匹配来重新启动搜索,而不是使用简单的方法。但是,您呈现的案例没有部分匹配,它总是在每次搜索迭代中找到完整的单词。因此,我确实希望KMP会为你提出的案例返回3场比赛。请注意,这是一种边缘情况,可能会尝试修改算法以利用haystack或word或两者的上下文信息,但现在您已经超越了KMP。希望这能有所帮助。

这个问题似乎最适合该网站,因为它要求对算法实现进行审查。@Slanec这个问题属于这里,它是一个关于算法的问题。OP做了他的家庭作业,并没有问“如何实施KMP?”而是给出了他迄今为止的结果,并询问它们是否正确。是用来回顾架构或风格的。@bolo算法问题肯定属于programmers.se吗?这取决于真正被问到的问题……来自你的维基文章:然而,就在当前部分匹配结束之前,我们通过了一个“AB”,这可能是新匹配的开始,所以我们必须考虑到这一点。。