Упрощеный алгоритм Бойера-Мура - 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;
 }

Объяснение кода листинга программы

В этом коде реализован упрощенный алгоритм Бойера-Мура для поиска подстроки в строке. Вот список действий, которые происходят в коде:

  1. Задаются исходные данные: целевая строка st, шаблон patt, массив для хранения длин каждого символа из шаблона mas.
  2. Определяется функция cmp_ptr, которая выполняет основной поиск подстроки.
  3. В функции cmp_ptr инициализируются счётчики i и j, которые будут использоваться для сравнения символов шаблона и целевой строки. Также инициализируется счётчик metka, который используется для обработки случая, когда текущий символ шаблона является концом строки.
  4. В цикле while происходит сравнение символов шаблона и целевой строки, пока не будет достигнута концовка одного из них.
  5. Если символы не совпадают, то в массив mas записывается длина шаблона, а счётчики i и j сбрасываются.
  6. Если символы совпадают, то счётчики i и j уменьшаются на единицу.
  7. После выхода из цикла while проверяется, достигли ли счётчики j конца целевой строки. Если да, то возвращается индекс первого вхождения подстроки.
  8. Если подстрока не найдена, то выводится сообщение Sovpadeniy ne naydeno.
  9. В основной функции main вычисляется длина целевой строки lenst и шаблона lenpatt.
  10. Заполняется массив mas длиной каждого символа шаблона.
  11. В цикле for для каждого символа шаблона, начиная с последнего, проверяется, является ли он концом строки. Если да, то в соответствующую ячейку массива mas записывается длина шаблона минус индекс символа.
  12. Вызывается функция cmp_ptr с передачей в неё длины шаблона, длины целевой строки, указатель на целевую строку и указатель на шаблон.
  13. Выводится сообщение с найденным индексом подстроки или сообщение об отсутствии совпадений.
  14. Код завершается возвратом значения 0 из функции main, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы