Это не приведет вас к самому эффективному способу перекрытия (динамическое программирование - это один из способов - есть и другие сумасшедшие методы, такие как суффиксные деревья), но вам следует начать:
Сначала подумайте, как бы вы нашли длину перекрытия с выравниванием начала обеих строк. Например, найдите самое длинное перекрытие между этими двумя:
programming
ungrammatical
В этом случае перекрывается только одно m
- длина 1.
Тогда подумайте, как бы вы "сместили" строки и искали перекрытие, когда они выровнены по-разному. (На самом деле не изменяйте строки: просто измените способ их обхода, чтобы сравнить их.) Какое совпадение между этими двумя?
programming
ungrammatical
Подумайте, как посмотреть на все возможные выравнивания. Если вы отслеживаете самый длинный из найденных, у вас самое длинное выравнивание между двумя конкретными строками.
После этого перейдите к проверке всех различных строк. Следите за тем, у кого лучший матч, и снова, как только вы посмотрите на все из них, у вас есть ответ.