From e29e7ede3b3327586084db8108e8ed0f1ae48a32 Mon Sep 17 00:00:00 2001 From: Nathan Bergey Date: Tue, 13 Sep 2022 21:53:29 -0400 Subject: [PATCH] Bm: A simple test version seems to work --- src/bm.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/bm.py b/src/bm.py index 5767ee9..8dce228 100644 --- a/src/bm.py +++ b/src/bm.py @@ -11,7 +11,7 @@ class Bm(object): def __init__(self, text: str, pattern: str): self.text = text self.pattern = pattern - self.table = make_km_table(pattern) + # self.table = make_km_table(pattern) def decide_slide_width(self, c: str) -> int: assert len(c) == 1 @@ -19,5 +19,36 @@ class Bm(object): return -1 def search(self) -> int: - raise Exception("TODO") + PATTERN_LENGTH = len(self.pattern) + TEXT_LENGTH = len(self.text) + + END_OF_PATTERN = PATTERN_LENGTH - 1 + LAST_CHAR_OF_PATTERN = self.pattern[-1] + + offset = {c: PATTERN_LENGTH - i -1 for i, c in enumerate(self.pattern[:-1])} + print(offset) + + matches = [] + head = END_OF_PATTERN + + while head < TEXT_LENGTH: + print(f'{" " * (head - PATTERN_LENGTH + 1)}{self.pattern}') + print(self.text[:head + 1]) + print(f'{" " * head}^') + + if self.text[head] == LAST_CHAR_OF_PATTERN: + for i, c in enumerate(reversed(self.pattern)): + # print(text[head - i], c) + if self.text[head - i] != c: + head += offset[self.text[head]] + break + else: + print("!!!") + return head - PATTERN_LENGTH + 1 + else: + try: + head += offset[self.text[head]] + except KeyError: + head += PATTERN_LENGTH + print('----------------------------------') return -1