一、模式匹配简介
S为主串,T为模式串。在主串S中寻找模式串T的过程称为模式匹配。
定位函数的功能是求模式串T在主串S中从pos的位置开始第一次出现的位置序号,该函数也称为串的模式匹配。
二、算法思想
从主串S的pos位置起,与模式串T逐位匹配。
1、初始化:主串从pos开始,模式串从头开始;
2、两串逐位比较:当主串、模式串均未遍历完时,对应字符做比较,若相等则主串、模式串的当前比较位置均后移;若不等则主串从开始比较位置的下一个开始,模式串从头开始;
3、判别:若匹配成功则返回起始位置,若不成功则返回 -1。
设置 i、j、start指示器:
1、i 指向主串S中当前比较的字符,起始指向S的首字符,此后每比较一步后移一个位置,一趟匹配失败时,回溯到该趟比较起点的下一个位置;
2、j 指向模式串T中当前比较的字符,起始指向T的首字符,此后每比较一步后移一个位置,一趟匹配失败时,回溯到T的首字符处;
3、start记录每趟比较时在主串S中的起点,每趟比较后,后移一个位置,以便确定下一趟的起始位置。
三、算法实现
int StrIndex(StringPtr s, int pos, StringPtr t) {
int i, j, start;
start = pos;
i = start;
j = 0;
while (i < s->len && j < t->len) {
if (s->ch[i] == t->ch[j]) {
++i;
++j;
} else {
/* 重新设置i、j、start */
++start;
i = start;
j = 0;
}
}
/* j >= t->len代表匹配成功 */
return j >= t->len ? start : -1;
}