我正在学习KMP字符串匹配算法,以便在给定的字符串中找到模式的总出现次数。我的部分代码如下,用java实现:
void kmpMatcher( string text, string pattern) {
int counter = 0;
int n=text.length();
int m=pattern.length();
int [] pi = computePrefix(); // computes the prefix array
int q = 0;
for (int i=0;i<n;i++) {
while(q > 0 && pattern.charAt(q) != text.charAt(i)) q = pi[q-1];
if (pattern.charAt(q) == text.charAt(i)) q++;
if (q==m) {
out.println(i-m+1);
q = pi[q-1];
counter++;
}
}
out.println("Total matches: " + counter);
} 有没有办法使用上面的函数在给定的输入文本字符串中找到不同的子串的总数?找到不同的子字符串的逻辑是什么?
发布于 2016-12-12 06:46:58
您可以在O(N^2)时间内完成此操作(这比将所有子字符串添加到例如i哈希表的朴素解决方案要好):
S的所有满足条件。T,我们可以构建一个T#S字符串并计算它的前缀函数。T的前缀且不是任何更长后缀的前缀的子字符串的数量。如果您需要更快的解决方案(如O(N)或O(N log N)),您可以使用后缀结构(如后缀自动机或后缀数组),但这些解决方案更为复杂。
https://stackoverflow.com/questions/41087979
复制相似问题