LINUX.ORG.RU

Поиск совпадающих частей в двух строках

 , ,


0

2

Есть набор выражений вида:

cABd => e
A => AB

где 'c', 'd', 'e', 'A', 'B' - последовательности символов. 'A' и 'B' не должы быть пусты.

' => ' - служебный токен, разделяющий строку на две части, по сути, тоже цепочка символов.

Нужно, для множества строк, найти пары строк соответствующих таким выражениям. Т.е. отождествить строку n и строку k с выражением 1 и выражением 2 соответственно.

Затем нужно обьединить эти строки, по правилу вида:

 A => cBde

Выражение - произвольное, каждая из цепочек может быть как слева так и справа от разделителя, как во входном выражении, так и в выходном.

Выражений порядка 10 шт. На данный момент решаю задачу написанием конечного автомата для каждого выражения, но выглядит это всё долго и муторно, отсюда вопрос - есть ли какой то алгоритм решающий эту задачу в более общем виде?

★★★★★

В принципе, если выделить dsl для этого подкласса автоматов, то не так уж и сложно выходит. Но уже чиство вопрос интереса, не мартышкина ли это работа.

pon4ik ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

Ты лучше честно скажи, это вся задача или частный случай. Потому что если первое - то достаточно обратить внимание на то, что соответствие второму шаблону однозначно, и задача становится тривиальной.

ABW ★★★★★
()
Ответ на: комментарий от ABW

Это частный случай, но все пары шаблонов содержат один, соответсвие которому однозначно, возможно это стоило указать в у словиях задачи, но я думал из постановки сиё очевидно.

С математической точки зрения, «заметить однозначность» - это простая операция, не спорю.

Но сиё нужно таки имплементировать.

Кроме как разбивать на состовляющие однозначный шаблон и потом, матчить эти составляющие с остальными строками и ничего умнее и не придумал.

Зато, пока писал тебе ответ, подумал, что вторую часть задачи, можно очень даже успешно решить с помощью регулярок.

pon4ik ★★★★★
() автор топика
Ответ на: комментарий от ABW

Точно, задача сводится к разбиению на токены шаблона который матчится однозначно. Так задача действительно принимает простой вид.

pon4ik ★★★★★
() автор топика

есть ли какой то алгоритм решающий эту задачу в более общем виде?

longest common substring это называется

disarmer ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.