用很简单的方式定义一下需要的变量。
char *pOrg = "abcabcabaabcaba";
int orgLen = 15;
char *pattern = "abcabab";
int ptnLen = 7;
char iamHere[6] = {0};
对每个pattern的字符,记录一下从头开始最大公共字串出现的长度。
void initIamHere()
{
for(int i = 1; i < ptnLen; i++)
{
if(pattern[i] == pattern[iamHere[i - 1]])
{
iamHere[i] = iamHere[i - 1] + 1;
}
else
{
if(pattern[i] == pattern[0])
{
iamHere[i] = 1;
}
}
}
}
不是for循环去遍历长串,而是用while循环去遍历pattern串。
bool KMP()
{
bool bMatched = false;
int idx = 0; // idx of pOgr;
int i = 0; // i of pattern;
while(1)
{
printf("KMP(): idx = %d, i = %d\n", idx, i);
if(pattern[i] != pOrg[idx])
{
idx = idx - iamHere[i - 1];
i = 0;
if(orgLen - idx < ptnLen)
{
bMatched = false;
break;
}
}
else
{
i++;
idx++;
}
if(i == ptnLen)
{
bMatched = true;
break;
}
}
return bMatched;
}