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

14.11.16

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

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

Скачать исходный код

Наименование Файл Версия Размер
НаибольшаяОбщаяПоследовательность.epf
.epf 6,42Kb
2
.epf 6,42Kb 2 Скачать

Задача нахождения наибольшей общей подпоследовательности (англ. 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][итК]  - стрелка вверх
Поднимаясь из правого нижнего угла мы можем двигаться по диагонали (если символ входит в НОП), либо пропускаем символ в первой строке (стрелка вверх), либо пропускаем символ во второй строке (стрелка влево).

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

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    2915    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.02.2024    5142    atdonya    22    

52

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    4129    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9490    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2275    26    progmaster    8    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16392    143    sapervodichka    112    

130

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7370    quazare    8    

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


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

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