1.朴素的匹配模式
int NaiveStrMatching(const string &T, const string & P)
{
int pLen = P.length(), tLen = T.length();
if (tLen < pLen)
return -1;
int t = 0, p = 0;
while (t < tLen && p < pLen)
{
if (T[t] == P[p])
{
t++;
p++;
}
else
{
t = t - p + 1;
p = 0;
}
}
if (p >= pLen)
return (t - pLen );
else
return -1;
}
2.KMP匹配模式
int * Next(const string & P)
{
int pLen = P.length();
int * next = new int[pLen];
next[0] = 0;
for (int i = 1; i < pLen; i++)
{
int temp = next[i - 1];
while (temp>0 && P[temp]!=P[i])
temp = next[temp-1];
if (P[temp] == P[i])
next[i] = temp + 1;
else
next[i] = 0;
}
return next;
}
int KMPStrMatching(const string &T, const string &P,int * Next)
{
int tLen = T.length(), pLen = P.length();
if (tLen < pLen)
return -1;
int p = 0, t = 0;
for (;p < pLen && t < tLen;t++)
{
while (p > 0 && P[p] != T[t])
p = Next[p - 1];
if (T[t] == P[p])
{
p++;
}
if (p == pLen)
return (t - p + 1);
}
return -1;
}
本文介绍了两种基本的字符串匹配算法:朴素的匹配模式和KMP匹配模式。朴素的匹配模式通过简单的逐字符比较实现匹配,而KMP算法则通过预处理模式串生成next数组来提高效率,避免不必要的比较。
616

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



