Сравнение строк. Наибольшая общая последовательность

14.11.16

Разработка - Универсальные функции

Заданы две строки Строка1 и Строка2. Требуется найти наибольшую общую подпоследовательность (НОП) этих строк.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
НаибольшаяОбщаяПоследовательность.epf
.epf 6,42Kb
2 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Задача нахождения наибольшей общей подпоследовательности (англ. longest common subsequence, LCS) — задача поиска последовательности, которая является подпоследовательностью нескольких последовательностей (обычно двух). Статья на вики (Пример взят оттуда)

Один из вариантов получения степени схожести двух строк.  

Подпоследовательность отличается от подстроки. Например, если есть исходная последовательность "ABCDEF", то "ACE" будет подпоследовательностью, но не подстрокой.

Используется метод динамического программирования.

Функция НаибольшаяОбщаяПоследовательность(Стр1, Стр2)
	
	МСтр1 = МассивИзСтроки(Стр1);
	МСтр2 = МассивИзСтроки(Стр2);
	
	м = МСтр1.Количество();
	н = МСтр2.Количество();
	
	Т = Новый ТаблицаЗначений;
	
	Для ит = 0 По н Цикл
		Т.Колонки.Добавить("К" + ит);		
	КонецЦикла;
	
	Для ит = 0 По м Цикл
		НовСтр = Т.Добавить();		
	КонецЦикла; 
	
	Т.ЗаполнитьЗначения(0);
	
	Для итС = 1 По м Цикл
		Для итК = 1 По н Цикл
			
			Если МСтр1[итС-1] = МСтр2[итК-1] Тогда
				Т[итС][итК] = Т[итС-1][итК-1] + 1;
			Иначе
				Т[итС][итК] = Макс(Т[итС][итК-1], Т[итС-1][итК]);
			КонецЕсли; 
			
		КонецЦикла; 
	КонецЦикла; 
	
	Возврат ВывестиНОП(Т, МСтр1, МСтр2, м, н);	
	
КонецФункции

Функция ВывестиНОП(Т, МСтр1, МСтр2, итС, итК)

	Если итС = 0 ИЛИ итК = 0 Тогда
		Возврат "";
	ИначеЕсли МСтр1[итС-1] = МСтр2[итК-1] Тогда
		Возврат ВывестиНОП(Т, МСтр1, МСтр2, итС-1, итК-1) + МСтр1[итС-1];	
	Иначе
		Если Т[итС][итК-1] > Т[итС-1][итК] Тогда
			Возврат ВывестиНОП(Т, МСтр1, МСтр2, итС, итК-1);
		Иначе	
			Возврат ВывестиНОП(Т, МСтр1, МСтр2, итС-1, итК);
		КонецЕсли; 
	КонецЕсли; 
	
КонецФункции

Функция МассивИзСтроки(ИсходнаяСтрока)

	Результат = Новый Массив;
	Длина = СтрДлина(ИсходнаяСтрока);
		
	Для ит=1 По Длина Цикл
		Результат.Добавить(Сред(ИсходнаяСтрока, ит, 1));	
	КонецЦикла; 
	
	Возврат Результат;
	
КонецФункции

Получаем таблицу длин наибольших общих полседовательностей (таблица значений Т). 

Для строк "DCBA" и "ABCB"  таблица выглядит так:

Например пересечение Т[2][3]равно 1. Значит для строк "DC" и "ABC" длина НОП = 1 (подпоследовательность "C").

Для Т[4][4] равно 2 (подпоследвоательность "CB").

Для того, чтобы получить НОП, нужно пройти эту таблицу из нижнего правого угла в левый верхний, поднимаясь по стрелкам.

Как получаются стрелки:

итС - индекс строки таблицы Т

итК - индекс колонки таблицы Т

МСтр1, МСтр2 - массивы символов строки1 и строки2

Если МСтр1[итС-1] = МСтр2[итК-1] - диагональная стрелка, этот элемент входит в НОП. Т[3][4] соответствует 3-му символу строки "DCBA" ("B") и 4-му символу строки "ABCB" ("B") .

Если Т[итС][итК-1] > Т[итС-1][итК]  - стрелка влево

Если Т[итС][итК-1] <= Т[итС-1][итК]  - стрелка вверх
Поднимаясь из правого нижнего угла мы можем двигаться по диагонали (если символ входит в НОП), либо пропускаем символ в первой строке (стрелка вверх), либо пропускаем символ во второй строке (стрелка влево).

В приложенной обработке только описанная функция.

Вступайте в нашу телеграмм-группу Инфостарт

Наибольшая общая последовательность динамическое программирование

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4650    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    8619    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    56584    dimanich70    85    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7969    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    71077    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9973    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1587 16.11.16 11:28 Сейчас в теме
Интересно. Подписался.
2. user840225 14.05.18 20:01 Сейчас в теме
Строка1 = "Отккровенние"
Строка2 = "Откровение"


НаибольшаяОбщаяПоследовательность возвращает "Откровение", а не "кровен"
(((
3. Alex_YAM 63 15.05.18 13:28 Сейчас в теме
(2)
Так и должно быть.

Подпоследовательность отличается от подстроки. Например, если есть исходная последовательность "ABCDEF", то "ACE" будет подпоследовательностью, но не подстрокой.
Поиск наибольшой подстроки это другая задача.
4. user840225 15.05.18 14:15 Сейчас в теме
(3) Спасибо. Не знал разницу.
Для отправки сообщения требуется регистрация/авторизация