The longest common substring (LCS) of two input strings $s,t$ is a common substring (in both of them) of maximum length. We can relax the constraints to generalize the problem: find a common substring of length $k$. We can then use binary search to find the maximum $k$. This takes time $\cal O(n \lg n)$ provided that solving the relaxed problem takes linear time.
Finding a $k$-common substring can be solved using a rolling hash:
- Compute hash values of all $k$-length substrings of $s$ and $t$.
- If a hash of $s$ coincides with a hash of $t,ドル then we've found a $k$-length common substring.
Step 1 uses a rolling hash to achieve linear time but I can't see how we can perform step 2. in linear time. Any suggestions?
-
1$\begingroup$ Use a hash table. (Of sorts. You've already computed the hashes.) $\endgroup$Yuval Filmus– Yuval Filmus2014年05月26日 23:06:28 +00:00Commented May 26, 2014 at 23:06
-
$\begingroup$ I still can't see how. Could you please write an answer? $\endgroup$mrk– mrk2014年05月27日 09:21:04 +00:00Commented May 27, 2014 at 9:21
1 Answer 1
In order to implement step 2, use a hash table. Add all the hashes of the $k$-length substrings of $s$ to the table. For each $k$-length substring of $t,ドル look it up on the table. This takes expected linear time for a large enough hash table.
Explore related questions
See similar questions with these tags.