假设主串S为“goodgoole”,子串为“google”。简单的说,对主串的每一个字符作为子串开头,与要匹配的字符串进行匹配。对主串作大循环,每个字符开头作T的小循环,直到匹配成功或者遍历完为止。
假设S和T的长度分别存与S[0]以及T[0]中。
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0 */
/* T非空,1≤pos≤StrLength(S) */
int Index(String S, String T, int pos)
{
int i = pos; //i用于主串S中当前位置下标,若pos不为1则从pos位置开始匹配
int j = 1; //j用于子串T中当前位置下标值
while(i ≤ S[0] && j≤ T[0] ) //若i小于S长度且j小于T的长度时循环
{
if(S[i] == T[j]) //两字母相等时则继续
{
++i;
++j;
}
else //指针退后重新开始匹配
{
i = i-j+2; //i退后到上次匹配的下一位
j = 1; //j退回到字串T的首位
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}
可以看出,朴素模式匹配的双循环结构在处理复杂的匹配任务时显得非常低效。