fork download
  1. def generate_bad_char_shift(pattern):
  2. """
  3. 生成坏字符跳转表
  4. """
  5. bad_char = {}
  6. for i in range(len(pattern)):
  7. bad_char[pattern[i]] = i
  8. return bad_char
  9.  
  10. def bm_search(text, pattern):
  11. """
  12. 实现BM算法的简化版本,只使用坏字符规则
  13. """
  14. m = len(pattern)
  15. n = len(text)
  16.  
  17. if m > n:
  18. return -1
  19.  
  20. bad_char = generate_bad_char_shift(pattern)
  21.  
  22. # 从模式串的末尾开始匹配
  23. i = m - 1
  24. while i < n:
  25. k = i
  26. j = m - 1
  27. while j >= 0 and text[k] == pattern[j]:
  28. k -= 1
  29. j -= 1
  30.  
  31. if j == -1: # 匹配成功
  32. return k + 1
  33.  
  34. # 坏字符规则:如果字符在模式串中不存在,移动m个位置
  35. # 如果存在,移动到该字符在模式串中最后一次出现的位置的后一位
  36. bad_char_shift = j - (bad_char.get(text[k], -1) if text[k] in bad_char else -1)
  37. i += max(1, bad_char_shift) # 至少移动1位
  38.  
  39. return -1 # 没有找到匹配
  40.  
  41. # 测试
  42. text = "HERE IS A SIMPLE EXANMPLE"
  43. pattern = "EXAMPLE"
  44. result = bm_search(text, pattern)
  45. print("Pattern found at index:", result)
Success #stdin #stdout 0.11s 14084KB
stdin
Standard input is empty
stdout
Pattern found at index: -1