Алгоритм Бойера Мура: Вывести на экран индексы всех вхождений заданной строки - 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(), которая вызывается при нахождении подстроки.
- После выполнения всех действий программа ожидает нажатия клавиши для завершения работы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д