Knuth-Morris-Pratt matcher type
This type is used to keep data for running the Knuth-Morris-Pratt (KMP) string matching algorithm. KMP is a linear time algorithm to locate all substrings of a string that match a given pattern. Generating the algorithm data is also linear in the length of the pattern but the data can be re-used to match the same pattern over different strings.
The KMP data for a pattern string can be generated using Matcher.ofString
. Then Matcher.find?
and Matcher.findAll
can be used to run the algorithm on an input string.
def m := Matcher.ofString "abba"
#eval Option.isSome <| m.find? "AbbabbA" -- false
#eval Option.isSome <| m.find? "aabbaa" -- true
#eval Array.size <| m.findAll "abbabba" -- 2
#eval Array.size <| m.findAll "abbabbabba" -- 3
- table : Array.PrefixTable Char
- pattern : Substring
The pattern for the matcher
Instances For
Make KMP matcher from pattern substring
Equations
- String.Matcher.ofSubstring pattern = { toMatcher := Array.Matcher.ofStream pattern, pattern := pattern }
Instances For
Make KMP matcher from pattern string
Equations
- String.Matcher.ofString pattern = String.Matcher.ofSubstring pattern.toSubstring
Instances For
The byte size of the string pattern for the matcher
Equations
- m.patternSize = m.pattern.bsize
Instances For
Find all substrings of s
matching m.pattern
.
Equations
- m.findAll s = String.Matcher.findAll.loop m s m.toMatcher #[]
Instances For
Accumulator loop for String.Matcher.findAll
Find the first substring of s
matching m.pattern
, or none
if no such substring exists.
Equations
Instances For
Returns all the substrings of s
that match pattern
.
Equations
- s.findAllSubstr pattern = (String.Matcher.ofSubstring pattern).findAll s
Instances For
Returns the first substring of s
that matches pattern
,
or none
if there is no such substring.
Equations
- s.findSubstr? pattern = (String.Matcher.ofSubstring pattern).find? s
Instances For
Returns all the substrings of s
that match pattern
.
Equations
- s.findAllSubstr pattern = (String.Matcher.ofSubstring pattern).findAll s.toSubstring