KMP算法

来源:互联网 发布:java面试专业技能 编辑:程序博客网 时间:2024/05/22 15:22
//长度为n的主串T中匹配长度为m的子串P (n>=m)。//匹配成功:存在P的每个字符依次和T中的一个连续字符序列相等//输出主串中匹配串起始位置,匹配失败输出-1//思路://首先用O(m)的时间对子串进行预处理,可通过子串本身的特性判断出需要右移几位才是可能匹配的//然后用O(n)的时间去完成匹配//时间复杂度: O(m+n)#include<stdio.h>#include<string.h>//失配函数//f[i]表示状态i失配时应转移到新的状态,特别注意f[0]=0//根据f[0],f[1],...,f[i-1]递推f[i]void getFail(char* P, int* f){int m=strlen(P);//递推边界初值f[0]=0;f[1]=0;for(int i=1;i<m;i++){int j=f[i];while(j && P[i]!=P[j])j=f[j];f[i+1]= P[i]==P[j]?j+1:0;}}int find(char* T, char* P, int* f){int n=strlen(T),m=strlen(P);getFail(P, f);//当前结点编号,初始为0号结点int j=0;//主串当前指针for(int i=0;i<n;i++){//顺着失配边走,直到可以匹配while(j && P[j]!=T[i])j=f[j];if(P[j]==T[i])j++;//找到if(j==m)return i-m+1;}return -1;}int main(){char T[100],P[100];int f[100];scanf("%s",T);scanf("%s",P);int ans = 0;ans=find(T,P,f);printf("%d\n",ans);return 0;}

0 0
原创粉丝点击