字符串模式匹配问题:在目标串 T T 中查找是否有与模式串匹配的子串。已经有很多算法用来解决这个问题(参考string matching algorithms),下面主要介绍朴素的模式匹配算法和KMP算法。
朴素的模式匹配
这个模式匹配方法又被称为Brute-Force算法。
该算法首先将目标串 T T 的第一个字符和模式串的第一个字符比较,若相等,继续逐个比较后续字符;若不等,从目标串 T T 的下一字符开始,重新与模式串的第一个字符进行比较。直到目标串 T T 的一个连续字符序列(子串)与模式串相等 ,则匹配成功,返回模式串 P P 在目标串中的匹配位置;否则,匹配失败,返回值 −1 − 1 。
Brute-Force算法每次遇到匹配不成功的情况时,目标串的扫描指针都要移到本次匹配开始位置的下一个字符继续与模式串进行匹配(回溯)。Brute-Force算法在最坏情况下总的比较次数为 (lengthT−lengthP+1)∗lengthP ( l e n g t h T − l e n g t h P + 1 ) ∗ l e n g t h P 。
C码实现如下:
/*Brute-Force算法*/
int brute_force_string_matching(char *target, char *pattern)
{
int indexT, indexP;
int lenT = strlen(target);
int lenP = strlen(pattern);
for (indexT = 0; indexT < lenT - lenP + 1; indexT++)
{
for (indexP = 0; indexP < lenP; indexP++)
{
if (target[indexT + indexP] != pattern[indexP])
{
break;
}
}
if (indexP == lenP)
{
return indexT;
}
}
return -1;
}