gpt4 book ai didi

java - Knuth–Morris–Pratt 算法

转载 作者:搜寻专家 更新时间:2023-11-01 03:38:35 24 4
gpt4 key购买 nike

Knuth–Morris–Pratt algorithm 的解决方案: 干草堆:AAAAAAAAAA,针: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;
}

最佳答案

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

关于java - Knuth–Morris–Pratt 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21435497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com