kmp算法Java
时间: 2025-04-28 10:27:24 浏览: 20
### KMP算法简介
KMP算法是由D.E.Knuth、J.H.Morris和V.R.Pratt于1977年共同提出的字符串匹配算法,也被称为Knuth-Morris-Pratt算法[^1]。这种算法的核心在于通过构建部分匹配表(通常称为`next[]`数组),使得当发生不匹配时可以跳过一些不必要的比较操作,从而提高效率。
### 部分匹配表(`next[]`)的作用
为了实现高效的字符匹配过程,KMP算法预先处理模式串P,计算出一个辅助数组——即前缀函数π(或称作失配函数),这个数组记录着对于每一个位置i,在此之前最长相等的真前后缀长度。具体来说就是如果存在k<i使p0..pk−1=pi−k..pi−1,则定义π[i]=k;否则取最大可能的小于此条件下的值作为π[i]。这部分逻辑体现在Java代码中便是构造所谓的`getNext()`方法来填充`next[]`数组[^3]。
### Java代码示例
下面给出一段完整的基于上述原理编写的用于执行KMP模式搜索功能的标准Java程序:
```java
public class KMPSearch {
private static int[] getNext(String pattern){
int j = -1;
int[] next = new int[pattern.length()];
next[0]=-1; // 初始化第一个元素为-1
for(int i=1;i<pattern.length();i++){
while(j>=0 && pattern.charAt(i-1)!=pattern.charAt(j)){
j = next[j];
}
if(pattern.charAt(i)==pattern.charAt(j+1)) ++j;
next[i]=(char)(j);
}
return next;
}
public static List<Integer> search(String text,String pattern){
List<Integer> result=new ArrayList<>();
int m=text.length();
int n=pattern.length();
/* 构建next数组 */
int[] next=getNext(pattern);
int i=0,j=-1;
while(i<m){
while(j>-1&&text.charAt(i)!=pattern.charAt(j+1))
j=next[j];
if(text.charAt(i)==pattern.charAt(j+1))
++j;
if(j==n-1){
result.add(i-n+1); // 记录下找到的位置
j=next[j]; // 继续寻找下一个可能出现的地方
}
++i;
}
return result;
}
}
```
这段代码实现了两个主要的功能:一是获取给定模式串的部分匹配值列表`getNext()`;二是利用这些信息完成实际的目标文本扫描工作`search()`。每当发现一个新的匹配项时就会将其起始索引加入到返回的结果集中去[^2]。
阅读全文
相关推荐














