Недавно я узнаю, как использовать дерево для решения самой длинной общей проблемы подстроки. Узнав из Вики и других онлайн-ресурсов, я обнаружил, что мы должны использовать дерево суффиксов, чтобы найти самую длинную общую подстроку.
Как сказано в вики:
Самые длинные общие подстроки набора строк можно найти, построив обобщенное дерево суффиксов для строк, а затем найдя самые глубокие внутренние узлы, которые имеют конечные узлы из всех строк в поддереве под ним.
Как сказал Джастин:
String = ABCDE$XABCZ$
End of word character 1 = $
└── (0)
├── (20) $
├── (22) ABC
│ ├── (15) DE$
│ └── (23) Z$
├── (24) BC
│ ├── (16) DE$
│ └── (25) Z$
├── (26) C
│ ├── (17) DE$
│ └── (27) Z$
├── (18) DE$
├── (19) E$
├── (21) XABCZ$
└── (28) Z$
В (компактном) дереве суффиксов вам нужно найти самый глубокий внутренний узел (узлы), у которого есть конечные узлы из всех строк. Если у вас есть несколько узлов на одной глубине, вам нужно сравнить длину строки, представленной этим узлом. то есть ABC, BC и C имеют одинаковую глубину, поэтому вам нужно сравнить длину строк ABC, BC и C, чтобы увидеть, какая из них длиннее; который, очевидно, ABC.
Здесь я подумал, что процесс поиска самых глубоких внутренних узлов, у которых есть листовые узлы из всех строк, на самом деле является процессом поиска самого длинного общего префикса всех суффиксов из всех строк.
Итак, вот вопрос: почему бы нам не построить дерево префиксов, в котором будут храниться все суффиксы из всех строк? Затем мы можем искать дерево префиксов, чтобы найти самый длинный общий префикс этих суффиксов. Я не могу сказать разницу между этими двумя. Может ли кто-нибудь дать мне некоторые подсказки, почему мы используем дерево суффиксов вместо дерева префиксов для решения этой проблемы?