Этот вопрос немного отличается от типа поиска самой длинной последовательности или подстроки из двух строк.
Учитывая две строки одного размера N, найдите самые длинные подстроки из каждой строки, чтобы подстроки содержали один и тот же мешок символов.
Две подстроки могут не обязательно иметь одну и ту же последовательность. Но у них должен быть такой же мешок с символами.
Например,
a = ABCDDEGF b = FPCDBDAX
Самый длинный совпадающий пакет символов - ABCDD (ABCDD от a, CDBDA от b)
Как решить эту проблему?
UPDATE
Цель состоит в том, чтобы найти подстроки из каждой входной строки, чтобы они имели одинаковый пакет символов. Говоря "подстрока", они должны быть последовательными символами.
Обновление. Первоначально я думал о подходе к динамическому программированию. Он работает, как показано ниже.
Чтобы сравнить два мешка с символами одинаковой длины K, для достижения этого потребуется время O (K). Преобразуйте каждую строку в сокращенную форму:
ABCDDEGF -> A1B1C1D2E1G1F1
FPCDBDAX -> A1B1C1D2F1P1X1
Укороченная форма сортируется по алфавиту с последующим количеством частот в строке. Построение, сортировка и сравнение сокращенных форм займет всего O (K). (Реализация может быть достигнута при использовании массива символов)
Два мешка с символами равны, так как их сокращенные формы имеют одинаковые символы и соответствующие частоты.
Кроме того, для определения разностных символов между двумя строками требуется время O (logK).
Теперь для двух входных строк:
- Если их сокращенные формы идентичны, то это самый длинный общий мешок символов.
- Найти символы в строке1, чтобы они не отображались в строке2. Tokenize string1 на несколько подстрок на основе этих символов.
- Найти символы в строке2, чтобы они не отображались в строке1. Tokenize string2 на несколько подстрок на основе этих символов.
- Теперь у нас есть два списка строк. Сравните каждую пару (которая в свою очередь является той же проблемой с меньшим размером ввода) и найдите самый длинный общий мешок символов.
В худшем случае будет O (N 3), и лучшим случаем будет O (N). Любая лучшая идея?