用很简单的方式定义一下需要的变量。
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;
}
本文介绍了一种高效的字符串匹配算法——KMP算法,并通过实例详细解释了其工作原理。文章首先定义了所需的变量,接着展示了如何初始化iamHere数组来记录pattern中每个字符的最大公共前缀长度,最后通过while循环而非传统的for循环来遍历较长的字符串,以查找是否存在匹配的模式。
453

被折叠的 条评论
为什么被折叠?



