BF算法常用于字符串的模式匹配
#include <string.h>
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef struct {
char data[MAXSIZE];
int curlen; //最后一个字符数组下标
}SeqString;
void StrConcat(SeqString& S1, SeqString& S2, SeqString& S)
{ //以S返回由S1和S2联接而成的新串
int j, k;
j = 0; k = 0;
while (j <= S1.curlen)
S.data[k++] = S1.data[j++];
j = 0;
while (j <= S2.curlen)
S.data[k++] = S2.data[j++];
S.curlen = k - 1;
}
int StrComp(SeqString& S1, SeqString& S2)
{ //比较两个字符串大小
int i = 0;
while (S1.data[i] == S2.data[i] && i != S1.curlen + 1)
i++;
return(S1.data[i] - S2.data[i]);
}
int Index_BF(SeqString& S, SeqString& T, int pos)
{
int i = 0, j = 0;
while (i <= S.curlen && j <= T.curlen) {
if (S.data[i] == T.data[j])
i++, j++;
else
i = i - j + 1, j = 0;
}
if (j >= T.curlen)
return (i - T.curlen );
else
return -1;
}//S为主串,T为子串,串curlen成员存放串长度;
//若主串S中存在与串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。
void SubString(SeqString& sub, SeqString& S, int pos, int len)
{
for (sub.curlen = 0; sub.curlen < len; sub.curlen++) {
sub.data[sub.curlen] = S.data[pos - 1];
pos++;
}
}//初始条件:串S存在,1≤pos≤StrLength(S) 且0≤len≤StrLength(S)-pos+1。
//操作结果:用Sub返回串S的第pos个字符起长度为len的子串。
void show(SeqString& S2)
{
int i;
for (i = 0; i <= S2.curlen; i++)
printf("%c", S2.data[i]);
printf("\n");
}
int main()
{
SeqString S, S1 = { "abcd",3 }, S2 = { "efg",2 };
SeqString T = { "de",1 };
SeqString Sub;
int comp, pos;
comp = StrComp(S1, S2);
printf("字符串S1和S2比较返回结果为:%d\n", comp);
StrConcat(S1, S2, S);
printf("连接后的串为:");
show(S);
SubString(Sub, S, 3, 2);
printf("取出的子串为:");
show(Sub);
pos = Index_BF(S, T, 0);
printf("查找到子串位置为:%d\n", pos);
return 0;
}