Алгоритм Бойера Мура: Вывести на экран индексы всех вхождений заданной строки - 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 и используется для поиска подстроки в более длинной строке. Список действий:
- В функции main() определены две строки: s1 (более длинная строка, в которой ищется подстрока) и s2 (подстрока, которую необходимо найти).
- Выводится на экран длина обеих строк.
- В функции Finder() объявлены два параметра: pParam и dwFoundAt.
- Значение pParam является указателем на переменную типа int, увеличиваемую на 1 при каждом новом нахождении подстроки.
- Параметр dwFoundAt используется для определения позиции вхождения подстроки в основную строку.
- В функции main() инициализируется переменная iCnt, которая будет использоваться для подсчета количества найденных подстрок.
- Вызывается функция QuickSearch(), которая осуществляет поиск подстроки в основной строке.
- В качестве параметров функции QuickSearch() передаются:
- начальный адрес подстроки s2;
- длина подстроки;
- начальный адрес основной строки s1;
- длина основной строки;
- адрес переменной iCnt, которая увеличивается на 1 при каждом нахождении подстроки;
- адрес функции Finder(), которая вызывается при нахождении подстроки.
- После выполнения всех действий программа ожидает нажатия клавиши для завершения работы.