You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.6 KiB

  1. from typing import Dict
  2. def make_km_table(pattern: str) -> Dict[str, int]:
  3. table = dict()
  4. raise Exception("TODO")
  5. return table
  6. class Bm(object):
  7. def __init__(self, text: str, pattern: str):
  8. self.text = text
  9. self.pattern = pattern
  10. # self.table = make_km_table(pattern)
  11. def decide_slide_width(self, c: str) -> int:
  12. assert len(c) == 1
  13. raise Exception("TODO")
  14. return -1
  15. def search(self) -> int:
  16. PATTERN_LENGTH = len(self.pattern)
  17. TEXT_LENGTH = len(self.text)
  18. END_OF_PATTERN = PATTERN_LENGTH - 1
  19. LAST_CHAR_OF_PATTERN = self.pattern[-1]
  20. offset = {c: PATTERN_LENGTH - i -1 for i, c in enumerate(self.pattern[:-1])}
  21. print(offset)
  22. matches = []
  23. head = END_OF_PATTERN
  24. while head < TEXT_LENGTH:
  25. print(f'{" " * (head - PATTERN_LENGTH + 1)}{self.pattern}')
  26. print(self.text[:head + 1])
  27. print(f'{" " * head}^')
  28. if self.text[head] == LAST_CHAR_OF_PATTERN:
  29. for i, c in enumerate(reversed(self.pattern)):
  30. # print(text[head - i], c)
  31. if self.text[head - i] != c:
  32. head += offset[self.text[head]]
  33. break
  34. else:
  35. print("!!!")
  36. return head - PATTERN_LENGTH + 1
  37. else:
  38. try:
  39. head += offset[self.text[head]]
  40. except KeyError:
  41. head += PATTERN_LENGTH
  42. print('----------------------------------')
  43. return -1