Я бы подошел к этому следующим образом:
рассмотрим первый символ в шаблоне ('a' в первом примере)
поскольку «а» до сих пор неизвестно, предположим длину для шаблона «а» (первоначально 1, что соответствует «r»)
перейти к следующему символу в шаблоне ('b ')
, поскольку «b» до сих пор неизвестно, предположить длину для шаблона «b» (первоначально «1», что соответствует «e»)
перейти к следующему символу в шаблоне ('b')
, поскольку «b» уже известно как «e», его можно сравнить сследующий кусок, "д".Здесь у нас есть ошибка, и нам нужно вернуться к первому вхождению шаблона 'b' и повторить попытку со следующей длиной (2,3, ..., пока не останется места).
если для 'b' не было совпадения, вернитесь к первому вхождению 'a'.
Этот процесс продолжается до тех пор, пока не будет исчерпана строка или не найдено совпадениебыл найден для всех шаблонов.
Это может быть реализовано с помощью рекурсивной процедуры, которая принимает в качестве входных данных
- текущего шаблона,
- набора гипотетических шаблонов исоответствующие подстроки,
- хвост строки.
Если текущий шаблон еще не был выдвинут, выдвиньте первую гипотезу для этого шаблона (следующий символ из строки) и продолжайтеПоиск.Позаботьтесь о том, чтобы записать уровень рекурсии, на котором была выдвинута гипотеза для этого шаблона.
Если текущий шаблон уже выдвинут, проверьте соответствие строки в текущей позиции.Если есть совпадение, рекурсивно продолжайте поиск, если вы не находитесь в конце строки и не сделали этого.
Если совпадения нет, и это первое вхождение этого шаблона, для которого была выдвинута гипотезавыполнено (т. е. глубина рекурсии равна зарегистрированной глубине рекурсии), увеличьте длину, чтобы снова выдвинуть гипотезу, и продолжите поиск.
Если совпадений нет, и это не первое вхождение этого шаблона, верните идентификаторнесоответствующий образец.(При выполнении рекурсивного вызова, если возвращаемое значение указывает на сбой, сравните возвращенный идентификатор шаблона с текущим и верните его вызывающей стороне, если он отличается.)
'a', 'a'= "r", "edbluebluered"
'b', 'a'= "r", 'b'= "e", "dbluebluered" => mismatch "e" <-> "d"
'b', 'a'= "r", 'b'= "ed", "bluebluered" => mismatch "ed" <-> "bl"
'b', 'a'= "r", 'b'= "edb", "luebluered" => mismatch "edb" <-> "lue"
...
'a', 'a'= "re", "dbluebluered"
'b', 'a'= "re", 'b'= "d", "bluebluered" => mismatch "d" <-> "b"
'b', 'a'= "re", 'b'= "db", "luebluered" => mismatch "db" <-> "lu"
...
'a', 'a'= "red", "bluebluered"
'b', 'a'= "red", 'b'= "b", "luebluered" => mismatch "b" <-> "l"
'b', 'a'= "red", 'b'= "bl", "uebluered" => mismatch "bl" <-> "ue"
'b', 'a'= "red", 'b'= "blu", "ebluered" => mismatch "blu" <-> "ebl"
'b', 'a'= "red", 'b'= "blue", "bluered"
'b', 'a'= "red", 'b'= "blue", "red"
'b', 'a'= "red", 'b'= "blue", "" done !
Условие "больше места нет"может быть просто реализовано путем проверки длины хвоста строки и сравнения с текущей длиной шаблона, но лучшая оценка возможна путем накопления длин всех гипотетических шаблонов для всех их вхождений в строке шаблона.Например, если мы выдвинули гипотезу «a» = «bl» и «b» = «uer», строка шаблона «abba» предсказывает длину по крайней мере 10.