您的位置:首页 > 其它

KMP算法和实现

2010-04-29 14:56 387 查看
题目:写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数

先来一个非KMP算法

int findSubString(char* pBase, char* pSource)
{
if(pBase == NULL || pSource == NULL)
return 0;

char* pSourceHead = pSource;
char* pBaseHead = pBase;
int nMatchCount = 0;

while(*pBase != '/0' && *pSource != '/0')
{
if(*pBase == *pSource)
{
pBase++;
pSource++;
nMatchCount++;
}
else
{
pSource = pSourceHead;							// 回溯到开头
pBase = pBase - (nMatchCount-1)*sizeof(char);   // 回溯到第一个比对位置后一个位置
nMatchCount = 0;
}
}

if(*pSource == '/0')
return pBase - pBaseHead - nMatchCount+1;
else
return 0;
}


关键在于 每次遇到不同 2个串都要回溯到开头

KMP算法精髓:

基准串不回溯 只回溯子串

回溯准则:

1. 尽量大

2. 镜面对称
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: