Вот простой алгоритм, который может заканчиваться в O ((m + n) * log (m + n)), и его намного проще реализовать по сравнению с алгоритмом дерева суффиксов, который является O (m + n) времени выполнения.
пусть он начинается с минимальной общей длины (minL) = 0 и максимальной общей длины (maxL) = min (m + n) + 1.
1. if (minL == maxL - 1), the algorithm finished with common len = minL.
2. let L = (minL + maxL)/2
3. hash every substring of length L in S, with key = hash, val = startIndex.
4. hash every substring of length L in T, with key = hash, val = startIndex. check if any hash collision in to hashes. if yes. check whether whether they are really common substring.
5. if there're really common substring of length L, set minL = L, otherwise set maxL = L. goto 1.
Оставшаяся проблема заключается в том, как хэшировать всю подстроку с длиной L за время O (n). Вы можете использовать формулу полинома следующим образом:
Hash(string s, offset i, length L) = s[i] * p^(L-1) + s[i+1] * p^(L-2) + ... + s[i+L-2] * p + s[i+L-1]; choose any constant prime number p.
then Hash(s, i+1, L) = Hash(s, i, L) * p - s[i] * p^L + s[i+L];