首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Knuth-Morris-Pratt算法

Knuth-Morris-Pratt算法
EN

Stack Overflow用户
提问于 2014-01-29 23:31:23
回答 1查看 2.8K关注 0票数 4

Knuth–Morris–Pratt algorithm:Haystack: AAAAAAAAAA的解决方案是正确的吗?

因为,在干草堆里有8个AAA实例,然而据我所知,knuth-morris-pratt算法只会找到3个。我这样想是不是错了?

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

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

代码语言:javascript
运行
复制
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;
    }
EN

回答 1

Stack Overflow用户

发布于 2014-01-30 09:19:53

KMP专注于在完全匹配搜索失败时优化搜索,但是可以重用部分匹配来重新启动搜索,而不是使用简单的方法。但是,您提供的情况没有部分匹配,它总是在每次搜索迭代中找到完整的单词。因此,我确实希望KMP会为您提出的情况返回3个匹配项。请注意,这是一种边缘情况,人们可能会修改算法,以利用干草堆或单词或两者的上下文信息,但您现在超越了KMP。希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21435497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档