普适算法
#include <stdio.h>
#include <string.h>
void get_next(char T[], int next[])
{
int i = 1, j = 0;
next[1] = 0;
while (T[i] != '\0')
{
if (j == 0 || T[i] == T[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int main()
{
char S[201], T[21], t[21];
gets(S);
gets(T);
int i;
int next[strlen(T) + 1];
for (i = 0; T[i] != '\0'; i++)
t[i + 1] = T[i];
t[i + 1] = '\0';
get_next(t, next);
for (int i = 1; i < strlen(T) + 1; i++)
printf("%d,", next[i]);
printf("\n");
i = 0;
int j = 0;
int print[100], run = 0;
while (S[i])
{
if (T[j] == S[i])
{
i++;
j++;
if (T[j] == '\0')
{
print[run++] = i - j;
i = i - j + 1;
j = 0;
}
}
else
{
i = i - j + 1;
j = 0;
}
}
if (run != 0)
{
for (int i = 0; i < run; i++)
printf("%d\n", print[i] + 1);
}
else
{
printf("-1");
}
return 0;
}
KMP
#include <stdio.h>
#define MAXSIZE 300
void GetNext(char *s2, int *next);
void KMP(char *s1, char *s2, int *next);
int slen(char *str);
int main()
{
char s1[MAXSIZE], s2[MAXSIZE];
int next[MAXSIZE];
int i;
s1[0] = -1;
s2[0] = -1;
scanf("%s", &s1[1]);
scanf("%s", &s2[1]);
GetNext(s2, next);
int length = slen(s2);
for (i = 1; i < length; i++)
{
printf("%d,", next[i]);
}
printf("\n");
KMP(s1, s2, next);
return 0;
}
void GetNext(char *s2, int *next)
{
int i = 1, length, j = 0;
length = slen(s2);
next[0] = -1;
next[1] = 0;
while (i < length)
{
if (j == 0 || s2[i] == s2[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
void KMP(char *s1, char *s2, int *next)
{
int len1 = slen(s1);
int len2 = slen(s2);
int i = 1, j = 1, flag = 0;
while (i < len1)
{
if (j == 0 || s1[i] == s2[j])
{
i++;
j++;
}
else
j = next[j];
if (j >= len2)
{
flag = 1;
printf("%d\n", i - len2 + 1);
}
}
if (flag == 0)
{
printf("-1");
}
}
int slen(char *str)
{
int n;
for(n=0;str[n]!='\0';n++);
return n;
}
//abcabdedfgabcabdef abcdefgabcdefgabcdefkkkkkkkkkkkkkkkk
//abcab abcab