模式匹配BF算法和KMP算法(C++实现)
BF算法:蛮力匹配,即从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则继续比较后续字符,否则从S的第二个字符和T的第一个字符进行比较。直到S或T所有字符比较完毕。
基本思想
- 在串 S 和串 T 中设比较的起始下标 i 和 j;
- 循环直到 S 或 T 的所有字符均比较完
2.1 如果S[i] 等于T[j],继续比较 S 和 T 的下一个字符;
2.2 否则,将 i 和 j 回溯,准备下一趟比较;- 如果T中所有字符均比较完,则返回匹配的起始比较下标;否则返回 0; KMP算法是对BF算法的改进,关键在不需回溯主串的i指针,且根据next数组的值移动子串的j指针。
int BF(char S[ ], char T[ ])
{
// start:T在S开始匹配的位置,i,j分别是S和T匹配的下标
int i = 0, j = 0, start = 0;
while (S[i] != '\0' && T[j] != '\0')
{
if (S[i] == T[j]) {
i++; j++;} // 匹配成功,则下标后移
else {
start++; i = start; j = 0; } // 匹配不成功,则回溯到start位置
}
if (T[j] == '\0') return start + 1; // 直到 T匹配完成,返回本趟开始匹配的位置
else return 0;
}
KMP算法是对BF算法的改进,关键在不需回溯主串的i指针,且根据next数组的值移动子串的j指针。
next[j]表示在匹配过程中与T[j]比较不相等时,下标 j 的回溯位置
基本思想:
- 在串 S 和串 T 中分别设比较的起始下标 i 和 j;
- 循环直到 S 或 T 的所有字符均比较完
2.1 如果S[i]等于T[j],继续比较 S 和 T 的下一个字符;否则将 j 向右滑动到next[j]位置,即 j=next[j];
2.2 如果 j=-1,则将 i 和 j 分别加 1,准备下一趟比较;- 如果 T 中所有字符均比较完毕,则返回匹配的起始下标;否则返回 0;
// KMP算法—先算出next[]数组
int* getNext(char T[ ])
{
int T_len = strlen(T);
int* next =