KMP 算法 KMP next数组 C++ JAVA

本文深入解析了KMP算法的原理与应用,通过C++和Java代码详细展示了如何构建next数组并进行字符串匹配,是理解和实现KMP算法的实用指南。

视频链接:KMP视频讲

#include<bits/stdc++.h>
using namespace std; 
//求next数组
void prefix_table(char pattern[],int prefix[],int n){
	prefix[0]=0;
	int len = 0;
	int i = 1;
	while(i < n){
		if(pattern[i] == pattern[len]){
			len++;
			prefix[i] = len;
			i++;
		}else{
			if(len>0){
				len = prefix[len-1]; 
			}else{
				prefix[i]=len;
				i++;
			}
		} 
	}
}

void move(int prefix[],int n){
	for(int i=n-1;i>0;i--){
		prefix[i]=prefix[i-1];
	}
	prefix[0] = -1;
}

void KMP_Search(char text[],char pattern[]){
	int m = strlen(text);
	int n = strlen(pattern);
	int *prefix = (int*) malloc(sizeof(int)*n);
	prefix_table(pattern,prefix,n);
	move(prefix,n);
	int i=0,j=0;
	while(i<m){
		if(j==n-1 && text[i] == pattern[j]){
			cout<<"Found pattern at:"<<i-j<<endl;
			j=prefix[j];
		}
		if(text[i] == pattern[j]){
			i++;
			j++; 
		}else{
			j = prefix[j];
			if(j=-1){
				i++;j++;
			}
		}
	}
}
int main() {
	char text[] = "aasasaababaa";
	char pattern[] = "aa";
	KMP_Search(text,pattern);
//	int prefix[9];
//	int n= 9;
//	prefix_table(pattern,prefix,n);
//	move(prefix,n);
//	for(int i=0;i<n;i++)
//		printf("%d",prefix[i]);
}

JAVA:

class Solution {
    public  int strStr(String haystack, String needle) {
        if (needle.length()==0) return 0;
        if (haystack.length()==0 || needle.length()==0) return -1;
        if (needle.length()>haystack.length()) return -1;
        int res=-1;
        if (needle.length()==1){
            for (int i = 0; i < haystack.length(); i++) {
                if (haystack.charAt(i)==needle.charAt(0)){
                    return i;
                }
            }
        }else {
            int i=0,j=0,hLen=haystack.length(),nLen=needle.length();
            int[] next = next(needle);
            while (i<hLen){
                if (j==-1 || haystack.charAt(i)==needle.charAt(j)){
                    i++;j++;
                }else {
                    j=next[j];
                }
                if (j==nLen){
                    res = i-j;
                    break;
                }
            }
        }

        return res;
    }
     int[] next(String ps){
        int pLength = ps.length();
        int[] next = new int[pLength];
        char[] p=ps.toCharArray();
        next[0]=-1;
        int j=1;
        next[j]=0;
        int k = next[j];
        while (j<pLength-1){
            if (k<0 || p[j]==p[k]){
                next[++j] = ++k;
            }else {
                k=next[k];
            }
        }
        return next;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值