| 0...2 |
3
|
4
|
5
|
6
|
7
|
8
|
9
|
|
目标串
|
...
| A |
B
|
C
|
D
|
A
|
B
|
A
|
...
|
模板串
|
|
A
|
B
|
C
|
D
|
A
|
B
|
D
|
|
A |
B
|
C
|
D
|
A
|
B
|
D
|
0
|
0
|
0
|
0
|
1
|
2
|
0
|
#include<stdio.h>
#include<string.h>
//计算next数组
void computeNext(intnext[], charT[])
{
int len = strlen(T);
if (len == 0)
return;
next[0] = 0;
for (int i = 1; i < len; i++)
{
if (T[i] == T[next[i - 1]])
next[i] = next[i - 1] + 1;
else
{
if (T[i] == T[0])
next[i] = 1;
else
next[i] = 0;
}
}
next[len] = -1;
}
//匹配字符串
int matchStr(charP[], charT[],intnext[])
{
int lenP = strlen(P);
int lenT = strlen(T);
int start = 0;
while (start <= (lenP - lenT))
{
for (int i = 0; i < lenT; i++)
{
if (P[start + i] == T[i] && i == lenT - 1)
return start;
if (P[start + i] != T[i])
{
if (i == 0)
start++;
else
start = start + (i - next[i - 1]);
printf("temp start:%d\n", start);
fflush(stdout);
break;
}
}
}
return -1;
}
void main()
{
char P[100] = "ABCDAAABCDABCDACDABCDABABCDABCDACDABCDABABCDABCDACD";
char T[50] = "ABCDABABCDABCDACD";
int next[50];
computeNext(next, T);
int k = 0;
while (next[k] != -1)
{
printf("next[%d]=%d\n", k, next[k]);
fflush(stdout);
k++;
}
int start = matchStr(P, T, next);
printf("start from:%d\n", start);
fflush(stdout);
}
KMP算法(难点):