(bf)朴素算法与kmp算法的实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct
{
char data[MAXSIZE];
unsigned int length;
}string;
typedef struct {
char* data;
unsigned int maxsize;
unsigned int length;
}String;
typedef struct LNode
{
char data;
struct LNode* next;
}LNode,*StringLink;
typedef struct Lnode {
char data[MAXSIZE];
struct Lnode* next;
}Lnode,*stringlink;
int index_bf(char sstr[], char tstr[])
{
if ((sstr == 0) || (tstr == 0)) return -1;
int ii = 0, jj = 0;
int slen = strlen(sstr), tlen = strlen(tstr);
while ((ii < slen) && (jj < tlen)) {
if (sstr[ii] == tstr[jj]) {
ii++;
jj++;
}
else {
ii = ii - jj + 1;
jj = 0;
}
}
if (jj == tlen)
return ii - jj;
return -1;
}
void getnext(char tstr[], char next[]) {
if ((tstr == 0) || (next == 0)) return;
int tlen = strlen(tstr);
if (tlen == 0) return;
if (tlen == 1) { next[0] = -1; return; }
if (tlen == 2) { next[0] = -1; next[1] = 0; return; }
next[0] = -1;
next[1] = 0;
int ii;
for (ii = 2; ii < tlen; ii++)
{
int maxlen = 0;
int jj = 1;
for (jj = 1; jj < ii; jj++)
{
char p1[tlen], p2[tlen];
memset(p1, 0, sizeof(p1));
memset(p2, 0, sizeof(p2));
strncpy(p1, tstr, jj);
strncpy(p2, tstr, tstr + ii - jj, jj);
if (strcmp(p1, p2) == 0) maxlen = jj;
}
next[ii] = maxlen;
}
return;
}
void getnextval(char tstr[], int next[], int nextval[])
{
if ((tstr == 0) || (next == 0) || (nextval == 0)) return;
int tlen = strlen(tstr);
nextval[0] = -1;
int ii;
for (ii = 1; ii < tlen; ii++) {
if (tstr[ii] == tstr[next[ii]]) {
nextval[ii] = nextval[next[ii]];
}
else {
nextval[ii] = next[ii];
}
}
}
int index_kmp(char sstr[], char tstr[],int tlen ){
if ((sstr == 0) || (tstr == 0)) return -1;
int ii = 0, jj = 0;
int slen = strlen(sstr), tlen = strlen(tstr);
int next[tlen];
getnext(tstr, next);
int nextval[tlen];
getnextval(tstr, next, nextval);
while ((ii < slen) && (jj < tlen)) {
if ((jj = -1) || (sstr[ii] = tstr[jj])) {
ii++;
jj++;
}
else {
jj = nextval[jj];
}
}
if (jj == tlen) return ii - tlen;
return -1;
}