讲解正反模式匹配算法之前大家先回忆下以前学数据结构的时候学的串的模式匹配算法:
1.一般算法
初始条件:
串S和T存在,T是非空串,假如S为:a b a b c
a b c a c b a b T为:a b c a c
1≤pos≤StrLength(S)。
操作结果:若主串S中存在和串T值相同的子串,
则返回它在主串S中第pos个字符之后
第一次出现的位置;
否则函数值为0。
...................................................
/ 返回子串T在主串S中第pos个字符之后的位置。
// 若不存在,则函数值为0。
// 其中,T非空,1≤pos≤StrLength(S)。
int Index(SString S,SString T, int pos)
{
i=pos;
{
i=pos;
j=1;
while(i<=s[0] && j<=T[0])
{
if(s[i]==T[j]) / /继续比较后继字符
{
++i;++j;
}
else //指针后退重新开始匹配
{
i=i-j+2;
while(i<=s[0] && j<=T[0])
{
if(s[i]==T[j]) / /继续比较后继字符
{
++i;++j;
}
else //指针后退重新开始匹配
{
i=i-j+2;
j=1;
}
}
if(j>T[0])
{
return i-T[o];
}
else //若不存在则返回 0
{
return 0;
}
}
}
}
if(j>T[0])
{
return i-T[o];
}
else //若不存在则返回 0
{
return 0;
}
}
以上算法就是自处理软件中哦好那个的“查找”/“替换”
.......上面算法的基本思想是:从主串S的第pos个字符起和模式的第一个字符比较,若想等,则继续逐个比较后续字符,否则从主串的下一个字符起再重新和模式的字符比较。依次类推,直至模式T中的每个字符依次和主串S中的一个连续的字符序列相等,则匹配成功
最坏为O(m*n) 一般为O(m+n)
2.首尾匹配算法
先比较模式串的第一个字符,再比较模式串的最后一个字符,最后比较模式串中从第二个到第n-1个字符。