Boyer-Moore string search: Difference between revisions

m
m (→‎{{header|Emacs Lisp}}: minor cleanup)
Line 16:
;; Compile the pattern to a right most position map
(defun bm_compile_pattern (pattern)
(let* ((R 256) (patLen (length pattern)) (rightMap (make-vector R -1)))
(letrightMap ((jmake-vector 256 -1))
(while (progn (setq j (-1+ j)) (< j patLen))
(aset rightMap (eltwhile pattern(> patLen (setq j) (1+ j) ) )
(setqaset rightMap (bm_compile_patternelt pattern j) j) )
rightMap
)
Line 28 ⟶ 29:
"Boyer-Moore string search"
(let ((startPos 0)
(skip 0)
(result nil)
(rightMap nil(bm_compile_pattern pattern)))
(result nil))
 
(setq rightMap (bm_compile_pattern pattern))
 
;; Continue this loop when no result and not exceed the text length
Line 40 ⟶ 38:
 
(let ((idx (length pattern)) (skip1 nil))
(while (and (not skip1) (>= (setq idx (1- idx)) 0))
;; skip when the character at position idx is different
(when (/= (elt pattern idx) (elt text (+ startPos idx)))
;; looking up the right most position in pattern
(let ((right (aref rightMap (elt text (+ startPos idx)))))
(if (>= right 0)
(progn (setq skip1 (max 1 (- idx right)))
(when (<= skip1 0) (setq skip1 (1)+ idx))
)
(progn (setq skip1 (1+ idx)))
)
)
)
)
(if (or (not skip1) (<= skip1 0))
)
(setq result startPos)
(if (or (not skip1) (<= skip1 0))
(progn (setq resultskip startPos)skip1)
(progn (setq skip skip1)) )
)
)
)
result
)
)
 
 
(let ((pattern "alfalfa")
6,951

edits