Упрощеный алгоритм Бойера-Мура - 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, что означает успешное выполнение программы.