Содержание
Последовательность — это некий упорядоченный набор элементов. Строка — это частный случай последовательности. В свою очередь, под термином «наибольшая общая подстрока» мы будем понимать такую подстроку максимальной длины, которая входит в две или больше строки. Представленный ниже алгоритм также подойдет и для поиска наибольшей повторяющейся последовательности не только букв, но и, в принципе, любых символов, например, цифр.
Суть алгоритма
Для того, чтобы найти наибольшую повторяющуюся последовательность символов, например, для строк A и B, необходимо заполнить таблицу (двумерный массив) размером n на m, где n и m — длины первой (A) и второй (B) строк, по следующим правилам:
- Если
A[i] == B[j]то:- для
i == 0 || j == 0, Array[i, j] = 1 - для
i > 0 && j > 0, Array[i, j] = Array[i — 1, j — 1] + 1
- для
Например, рассмотрим две строки: «ПОИСК» и «ПИСК» (наибольшая повторяющаяся подстрока в этом случае — «ИСК»):
Реализация алгоритма поиска наибольшей повторяющейся подстроки в C#
Код консольного приложения для поиска набольшей повторяющейся подстроки представлен ниже:
using System;
namespace ConsoleApp1
{
internal class Program
{
static string LCS(string a, string b)
{
var n = a.Length; //длина первой строки
var m = b.Length; //длина второй строки
var array = new int[n, m]; //создаем двумерный массив m x n
var maxValue = 0;
var maxI = 0;
for (int i = 0; i < n; i++) //цикл по символам строки A
{
for (int j = 0; j < m; j++) //цикл по символам строки B
{
if (a[i] == b[j]) //проверяем совпадают ли символы в позициях i и j
{
array[i, j] = (i == 0 || j == 0)
? 1
: array[i - 1, j - 1] + 1;
if (array[i, j] > maxValue)
{
maxValue = array[i, j];//максимальное количество повторяющихся символов
maxI = i; //запоминаем позицию в строке A с которой необходимо начать копирование подстроки
}
}
}
}
//возвращаем наибольшую повторяющуюся подстроку
return a.Substring(maxI + 1 - maxValue, maxValue);
}
static void Main(string[] args)
{
Console.Write("Первое слово: ");
var a = Console.ReadLine();
Console.Write("Второе слово: ");
var b = Console.ReadLine();
Console.WriteLine($"Наибольшая общая подстрока: {LCS(a, b)}");
Console.ReadLine();
}
}
}
Результат работы программы
Второе слово: писк
Наибольшая общая подстрока: иск
Итого
Для реализации алгоритма поиска наибольшей повторяющейся последовательности нам понадобились знания о том, что из себя представляет массив и умение работать с циклами (в данном случае — с циклом for).
