Я написал этот код, и он работает в некоторых случаях. Иногда, однако, это терпит неудачу, и я просто не понимаю, почему. Может кто-то, пожалуйста, помогите мне обнаружить ошибку?Соответствие шаблону в длинной текстовой строке
Он работает: Строка: ishanthakkar ishan
скороговоркой: ishan
Но он не для:
Строка: cpr ograming
скороговоркой: cpr
Источник:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *compute_prefix_function(char *pattern, int psize)
{
int k = -1;
int i = 1;
int *pi = malloc(sizeof(int)*psize);
if (!pi)
return NULL;
pi[0] = k;
for (i = 1; i < psize; i++) {
while (k > -1 && pattern[k+1] != pattern[i])
k = pi[k];
if (pattern[i] == pattern[k+1])
k++;
pi[i] = k;
}
return pi;
}
// Th это строка поиска соответствия функции в O (n) времени, поэтому повторяйте ее через текстовую строку только один раз, когда обнаружен символ unmatching; он приступить к следующему символу и начать по сравнению с первым символом строки для поиска т.е. картины
int kmp(char *target, int tsize, char *pattern, int psize)
{
int i;
int *pi = compute_prefix_function(pattern, psize);
int k = -1;
if (!pi)
return -1;
for (i = 0; i < tsize; i++) {
while (k > -1 && pattern[k+1] != target[i])
k = pi[k];
if (target[i] == pattern[k+1])
k++;
if (k == psize - 1) {
free(pi);
return i-k;
}
}
free(pi);
return -1;
}
int main(int argc, const char *argv[])
{
char target[200];
char *ch = target;
char pattern[20];
int i;
printf("Enter the string: \n");
fgets(target,100,stdin);
printf("Enter the string to be matched: \n");
fgets(pattern,20,stdin);
i = kmp(target, strlen(target), pattern, strlen(pattern));
if (i >= 0)
printf("matched @: %s\n", ch + i);
getch();
return 0;
}
Попробуйте правильно сделать код отступа - не нужно лишних пробелов. –
Можете ли вы прокомментировать свой код так, чтобы цель различных частей была ясна? Насколько я знаю, функция типа 'kmp()' не является частью стандартного лексикона вычислений, и вы только заявляете, что программа выполняет «сопоставление шаблонов», даже не указав, что это значит. Насколько нам известно, код может быть правильным, как указано. –
@ John: Извините за неудобства, я добавил небольшое описание, чтобы понять программу. На самом деле, я не кодировал всю программу, поэтому у меня также есть путаница! –