Алгоритм Бойера Мура: Вывести на экран индексы всех вхождений заданной строки - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Написал программу, которая находит подстроку в строке , только надо сделать так , чтобы она выводила на экран индексы всех вхождений данной строки.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int  BM (int *a ,char *text, char *shablon)
{
    int sdvig[256];
    int q = 0;
    int i = 0;
    int j = 0;
    int lengthS = strlen (shablon);
    int lengthN = strlen (text);
    for (i = 0; i < 256; i++)
        sdvig[i] = lengthS;
    for (i = 0; i < lengthS - 1; i++)
        sdvig[shablon[i]] = lengthS - i - 1;  /*таблица смещений*/
    i = lengthS - 1;
    j = i; 
        
        while (j > 0 && i <= lengthN)
        {
            j = lengthS - 1; /*текущий символ в shablon*/
            q = i; /* текущий символ в text*/
            while (j > 0 && shablon[j] == text[q])
            {
                --q;    
                --j;
            }
            i += sdvig[text[i]];
        }
        if ( q > lengthN - lengthS)
        {
            return 0;
            else return q + 1;
        }
    }
}
 
int main ()
{
    int u = 0;  
    char text[256] ;
    char shablon[256]; 
    fgets(text,255,stdin);
    fgets(shablon,255,stdin);
  if (shablon > text)
  {
    printf("Error");
    return -1;
  }
  int *a = (int*)calloc(100000,sizeof(int));
    u = BM( text , shablon);
    return 0;
}

Решение задачи: «Алгоритм Бойера Мура: Вывести на экран индексы всех вхождений заданной строки»

textual
Листинг программы
#include "stdafx.h"
 
#include "search_quick.h"
 
#pragma warning (disable: 4100)     // 'dwFoundAt' : unreferenced formal parameter
static void __fastcall Finder
(
   void*             pParam,
   DWORD             dwFoundAt
)
{
   printf("%d. Found at: [%d]\n",(*(int*)pParam)++ + 1,dwFoundAt);
}
 
int main()
{                   
   const char  s1[] = "fasdfasqwerfasdfqwerasdfasdf";
   const char  s2[] = "qwer";
 
   printf("haystack: %s\n",s1);
   printf("needle: %s\n\n",s2);
 
   int   iCnt = 0;
      
   QuickSearch((BYTE*)s2,strlen(s2),(BYTE*)s1,strlen(s1),&iCnt,Finder);
 
   system("pause");
   
   return 0;
}

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

Алгоритм Бойера-Мура, также известный как метод двоичного поиска, реализуется в функции Finder и используется для поиска подстроки в более длинной строке. Список действий:

  1. В функции main() определены две строки: s1 (более длинная строка, в которой ищется подстрока) и s2 (подстрока, которую необходимо найти).
  2. Выводится на экран длина обеих строк.
  3. В функции Finder() объявлены два параметра: pParam и dwFoundAt.
  4. Значение pParam является указателем на переменную типа int, увеличиваемую на 1 при каждом новом нахождении подстроки.
  5. Параметр dwFoundAt используется для определения позиции вхождения подстроки в основную строку.
  6. В функции main() инициализируется переменная iCnt, которая будет использоваться для подсчета количества найденных подстрок.
  7. Вызывается функция QuickSearch(), которая осуществляет поиск подстроки в основной строке.
  8. В качестве параметров функции QuickSearch() передаются:
    • начальный адрес подстроки s2;
    • длина подстроки;
    • начальный адрес основной строки s1;
    • длина основной строки;
    • адрес переменной iCnt, которая увеличивается на 1 при каждом нахождении подстроки;
    • адрес функции Finder(), которая вызывается при нахождении подстроки.
  9. После выполнения всех действий программа ожидает нажатия клавиши для завершения работы.

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


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

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

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