int Index(SString S, SString T, int pos)
{ // 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。
// 其中,T非空,1≤pos≤StrLength(S)。算法4.5
int i, j;
if (1 <= pos && pos <= S[0])
{
i = pos;
j = 1;
while (i <= S[0] && j <= T[0])
if (S[i] == T[j]) // 继续比较后继字符
{
++i;
++j;
}
else // 指针后退重新开始匹配
{
i = i - j + 2;
j = 1;
}
if (j > T[0])
return i - T[0];
else
return 0;
}
else
{
return 0;
}
}
示例
#include <stdio.h>
#include <string.h>
/*
目标串:a b a b c b a c d a
模式串:b a c d a
1 2 3 4 5 6 7 8 9 10
目标串:a b a b c b a c d a
模式串: b a c d a
知识点:
1、字符串的结束标志是 `\0`
2、求字符串长度的函数:strlen() 其求的长度不包含 '\0'(空字符) 占用的空间
3、'\0'是转译字符,意思是告诉编译器,这不是字符0,而是空字符。空字符\0对应的二进制为00000000,而数字0为00110000
*/
int BF(char S[], char T[])
{
int index = 0;
int i = 0;
int j = 0;
while (S[i] != '\0' && T[j] != '\0')
{
if (S[i] == T[j])
{
//如果匹配成功,则继续比较下一对字符
i++;
j++;
}
else
{
//如果匹配不成功,主串和子串回溯坐标。index记录的是每次匹配时的开始位置
index++;
i = index;
j = 0;
}
}
if (T[j] == '\0')
return index + 1;
else
return 0;
}
int main(int argc, char *argv[])
{
char a[30] = "ababcbacda";
printf("主串: %s 长度为 %d \r\n", a, (int)strlen(a));
char b[10] = "bacda";
printf("子串: %s 长度为 %d \r\n", b, (int)strlen(b));
printf("匹配的开始位置是:%d\r\n", BF(a, b));
return 0;
}
/*
编译:gcc test.c -o test
运行:./test
结果:
主串: ababcbacda 长度为 10
子串: bacda 长度为 5
匹配的开始位置是:6
*/
/********************* end of file *********************/
时间复杂度
O(m*n)