{% else-1 %}
Алгоритм поиска образа (первого вхождения) в строке

                        
static int[] _d;        

///<summary>Составление матрицы смещения</summary>
///<param name="image">Образ</param>
static void Shift(string image)
{
_d = new int[char.MaxValue];

for (var i = 0; i < _d.Length; i++)
{
_d[i] = image.Length;
}

for (var i = 0; i < image.Length; i++)
{
_d[image[i]] = image.Length - i;
}
}

///<summary>Реализация алгоритма Бойера-Мура</summary>
///<param name="_source">Строка</param>
///<param name="_image">Образ</param>
///<param name="sensitivity">Чувствительность к регистру</param>
static void Search(string _source, string _image, bool sensitivity = false)
{
var source = _source;
var image = _image;

if (!sensitivity)
{
source = _source.ToLower();
image = _image.ToLower();
}

Console.WriteLine("Строка: " + source);
Console.WriteLine("Образ: " + image);

Shift(image);

if (image.Length > source.Length)
{
Console.WriteLine("Error: img > src");
return;
}

if (image == source)
{
Console.WriteLine("Образ и строка равны");
return;
}

for (var i = image.Length; i < source.Length + 1; ) // Основной цикл
{
for (var j = image.Length - 1; j >= 0; j--) // Цикл проверки на совпадения
{
if (image[j] == source[i - image.Length + j]) // Проверка на совпадения
{
if (j == 0) // Если первый символ образа схож с текущим символом строки
{
Console.WriteLine("Образ найден на {0} символе строки.", ((i - image.Length) + 1));
return;
}
}
else
{
i += _d[source[i]];
break;
}
}
}

Console.WriteLine("Образ не был найден в исходной строке.");
}
0 15 0
Без комментариев...