String search in constant space, linear time, for nonorderable alphabets.
In Rust terms this means we can define the function:
rust
fn gs_find<T>(text: &[T], pattern: &[T]) -> Option<usize>
where T: Eq
{
// ...
}
and the function computes in O(n) time and O(1) space. In the worst case, this algorithm makes 4 n character comparisons.
Note that the Crochemore-Perrin (“Two Way” algorithm) is much superior if there is a linear order for the alphabet.
This work is Copyright 2017 by Ulrik Sverdrup "bluss"; see license terms in the package.
Both papers are recommended reading. The comments in this crate’s implementation are also meant to explain and point out important details, so that’s recommended reading too.