BF算法为什么需要回溯?
比如如下字符串:
S:aaa
acefdffg
T: aaa
c
如果不进行回溯的话,当比较到第四个字符,a,c的时候,判断a != c,这时就需要移动T,将T的首字母移动到S中第四个a那里,继续从先前匹配失败的位置开始比较。
这时 很明显就错误了,因为它跳过了正确的字符串。
而如果要进行回溯的话,就是用S中的第二个字符开始和T中的第一个字符进行比较。每次移动的长度是 1.
朴素字符串匹配算法C语言实现
返回首次出现模式串的位置
int basicSerchingString(char * str,char *subStr)
{
char *outS = str;
char *s = str;
char *p = subStr;
int i = 0;
while (*outS != '\0') {// 外层循环用于主串回溯
i ++;
s = outS;
while ((*s++) != (*p++)); //如果两个字符串匹配则继续比较下一个字符,否则继续
if (*p == '\0') {
break;
}
outS++;
p = subStr;
}
return i;
}