Упрощеный алгоритм Бойера-Мура - C (СИ)
Формулировка задачи:
Здараствуйте. пытался реализовать упрощенный алгоритм Бойера-Мура. Но он не работает... Помогите найти ошибку.
#include <conio.h> #include <iostream.h> main() { int i,j,l,res,k,N,M; char a[80], x[80]; int d[256]; gets(a); gets(x); N=strlen(a); M=strlen(x); res=0; for(i=0;i<256;i++) d[i]=M; for(i=0;i<M-1;i++) d[a[i]]-=i+1; i=M-1; j=i; while(j>0 && i<N){ j=M-1; k=i; while(j>0 && x[j]==a[k]){ i--; k--; } i+=d[a[i]]; } if(i<0) res=k+1; else res=-1; cout<<res; getch(); }
Решение задачи: «Упрощеный алгоритм Бойера-Мура»
textual
Листинг программы
#include<stdio.h> #include<conio.h> #include<string.h> int main() { char st[80]={"Little gray mouthe where is your house"},patt[80]= {"house"}; int i,j,lenst,lenpatt,mas[256],metka; int cmp_ptr(int lenpatt,int lenst,char st[80],char patt[80]) { int i,j,metka; metka=i=j=lenpatt-1; while(i>0 && j<lenst) { if(st[j]!=patt[i]) { metka=metka+mas[st[metka]]; i=lenpatt-1; j=metka; } else { i=i--; j=j--; } } if(j>=lenst) return -1; else return j; } lenst=strlen(st); lenpatt=strlen(patt); for(i=0;i<256;i++) mas[i]=lenpatt; for(i=lenpatt-2;i>=0;i--) if(mas[patt[i]]==lenpatt) mas[patt[i]]=(lenpatt-1-i); i=cmp_ptr(lenpatt,lenst,st,patt); if(i>0) printf("Index pervogo vhojdeniya = %d",i); else printf("Sovpadeniy ne naydeno"); return 0; }
Объяснение кода листинга программы
В этом коде реализован упрощенный алгоритм Бойера-Мура для поиска подстроки в строке. Вот список действий, которые происходят в коде:
- Задаются исходные данные: целевая строка
st
, шаблонpatt
, массив для хранения длин каждого символа из шаблонаmas
. - Определяется функция
cmp_ptr
, которая выполняет основной поиск подстроки. - В функции
cmp_ptr
инициализируются счётчикиi
иj
, которые будут использоваться для сравнения символов шаблона и целевой строки. Также инициализируется счётчикmetka
, который используется для обработки случая, когда текущий символ шаблона является концом строки. - В цикле
while
происходит сравнение символов шаблона и целевой строки, пока не будет достигнута концовка одного из них. - Если символы не совпадают, то в массив
mas
записывается длина шаблона, а счётчикиi
иj
сбрасываются. - Если символы совпадают, то счётчики
i
иj
уменьшаются на единицу. - После выхода из цикла
while
проверяется, достигли ли счётчикиj
конца целевой строки. Если да, то возвращается индекс первого вхождения подстроки. - Если подстрока не найдена, то выводится сообщение
Sovpadeniy ne naydeno
. - В основной функции
main
вычисляется длина целевой строкиlenst
и шаблонаlenpatt
. - Заполняется массив
mas
длиной каждого символа шаблона. - В цикле
for
для каждого символа шаблона, начиная с последнего, проверяется, является ли он концом строки. Если да, то в соответствующую ячейку массиваmas
записывается длина шаблона минус индекс символа. - Вызывается функция
cmp_ptr
с передачей в неё длины шаблона, длины целевой строки, указатель на целевую строку и указатель на шаблон. - Выводится сообщение с найденным индексом подстроки или сообщение об отсутствии совпадений.
- Код завершается возвратом значения 0 из функции
main
, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д