BF + KMP + BM 字符串搜索算法

时间:2023-03-09 22:09:43
BF + KMP + BM 字符串搜索算法

BF

#include <stdio.h>
#include <string.h> int simplicity(char *s, char *t, int pos); int simplicity(char *s, char *t, int pos)
{
int slen = strlen(s);
int tlen = strlen(t); int i = pos;
int j = 0; while(i < slen && j < tlen) {
if(s[i] == t[j]) {
i++;
j++;
} else {
i = i - j + 1;
j = 0;
}
} // subscripts start at 0 : j == len
// subscripts start at 1 : j > len
if(j == tlen) {
return i - j;
} return -1;
} int main()
{
int pos = 0;
char *s = "goodgoogle";
char *t = "goog"; printf("{s:'%s', t:'%s', pos:'%d', result(subsripts start at 0):'%d'}\n", s, t, pos, simplicity(s, t, pos));
return 0;
}

KMP

#include <stdio.h>
#include <string.h> void get_nextSubscripts(char *t, int *next);
int kmp(char * s, char *t, int pos); void get_nextSubscripts(char *t, int *next)
{
int tlen = strlen(t); int i = 0; // suffix
int j = -1; // prefix next[0] = -1; while(i <= tlen) {
if(j == -1 || t[i] == t[j]) {
i++;
j++; if(t[i] == t[j]) {
next[i] = next[j];
} else {
next[i] = j;
}
} else {
j = next[j];
}
}
} int kmp(char *s, char *t, int pos)
{
int next[255];
int slen = strlen(s);
int tlen = strlen(t); int i = pos;
int j = -1; get_nextSubscripts(t, next); while(i < slen && j < tlen) {
if(j == -1 || s[i] == t[j]) {
i++;
j++;
} else {
j = next[j];
}
} if(j == tlen) {
return i - j;
} return -1;
} int main()
{
int pos = 0;
char *s = "goodgoogle";
char *t = "goog"; printf("{s:'%s', t:'%s', pos:'%d', result(subsripts start at 0):'%d'}\n", s, t, pos, kmp(s, t, pos)); return 0;
}

BM