周末复习了下数据库。今天做了一道字符串匹配的题目,用的是KMP算法。没做出来,重新复习了一下KMP算法。A串在B串中查找。核心就是两步:1、对要A串自我匹配,求next数组。2、串A与串B进行匹配,求出数组f,其中f[i]表示B中以 i 结尾的子串与A的前缀能够匹配的最长长度,所以如果f[i]等于A串的长度,就代表A串与B串的子串匹配成功。
具体代码如下:
//求next数组
next[i]=0;
for (int i=2,j=0;i<=n;i++)
{
while(j>0&&a[i]!=a[j+1])j=next[j];
if(a[i]==a[j+1])j++;
next[i]=j;
}
//求f数组
for(int i=1,j=0;i<=m;i++)
{
while(j>0&&(j==n||b[i]!=a[j+1]))j=next[j];
if(b[i]==a[j+1])j++;
f[i]=j;
if(f[i]==n)//此时就是A串与B串匹配成功的出现位置
}
复杂度O(MN)