KMP算法又称“看毛片”算法,是大学生必备的算法之一。也是考研重点,同样也是当代大学生的盲点所在。细细品味大学生活的点点滴滴,会有成功的一天。
C语言
#include<stdio.h>
#include<string.h>
void makeNext(const char P[],int next[])
{
//P为模式串
//i为后缀
//j为前缀
int i,j;
int m = strlen(P);
next[0] = 0;
for (i = 1,j = 0; i < m; ++i)
{
//while为当遇到不匹配的时候,k进行回溯。
while(j > 0 && P[i] != P[j])
j = next[j-1];
//如果相等,都进行+1;
if (P[i] == P[j])
{
j++;
}
//对next进行赋值
next[i] = j;
}
}
int kmp(const char T[],const char P[],int next[])
{
//j为副串
//i为主串
int n,m;
int i,j;
n = strlen(T);
m = strlen(P);
makeNext(P,next);
for (i = 0,j = 0; i < n; ++i)
{
while(j > 0 && P[j] != T[i])
j = next[j-1];
if (P[j] == T[i])
{
j++;
}
if (j == m)
{
printf("Pattern occurs with shift:%d\n",(i-m+1));
}
}
}
int main()
{
int i;
int next[20]={0};
char T[] = "ababxbababcadfdsss";
char P[] = "bababc";
printf("%s\n",T);
printf("%s\n",P );
// makeNext(P,next);
kmp(T,P,next);
for (i = 0; i < strlen(P); ++i)
{
printf("%d ",next[i]);
}
printf("\n");
return 0;
}
结果图
Java描述
package alizantest;
/*
*@山东科技大学小昝
*/
public class KMP {
public static void main(String[] args) {
String str = "ababxbababcadfdsss";
String str1 = "bababc";
int[] next = new int[1024];
IndexKMP(str,str1,next);
}
private static void IndexKMP(String str, String str1, int[] next) {
// TODO Auto-generated method stub
int i, j;
int n = str.length();
int m = str1.length();
getNext(str1,next);
for(i = 0,j = 0;i<n;++i){
while(j>0&&str.charAt(i)!=str1.charAt(j)){
j = next[j-1];
}
if(str.charAt(i)==str1.charAt(j)){
j++;
}
if(j == m){
System.out.println("在主串的"+(i-m+1)+"处开始");
System.out.println("@山东科技大学 小昝");
return;
}
}
}
private static void getNext(String str1, int[] next) {
// TODO Auto-generated method stub
int i,j;
int n = str1.length();
for(i = 1,j=0;i< n ;++i){
while(j>0&&str1.charAt(i)!=str1.charAt(j)){
j = next[j-1];
}
if(str1.charAt(i)==str1.charAt(j)){
j++;
}
next[i] = j;
}
}
}
结果
KMP算法的复杂度
O(m+n)