Skip to content

Commit c3d4b9e

Browse files
mindauglMaximSmolskiypre-commit-ci[bot]
authored
Add doctests for the boyer_moore_search algorithm. (TheAlgorithms#12769)
* Add doctests for the boyer_moore_search algorithm. * Update boyer_moore_search.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update boyer_moore_search.py * Update boyer_moore_search.py --------- Co-authored-by: Maxim Smolskiy <mithridatus@mail.ru> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 4b077c0 commit c3d4b9e

File tree

1 file changed

+33
-16
lines changed

1 file changed

+33
-16
lines changed

strings/boyer_moore_search.py

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,42 @@
1111
a shift is proposed that moves the entirety of Pattern past
1212
the point of mismatch in the text.
1313
14-
If there no mismatch then the pattern matches with text block.
14+
If there is no mismatch then the pattern matches with text block.
1515
1616
Time Complexity : O(n/m)
1717
n=length of main string
1818
m=length of pattern string
1919
"""
2020

21-
from __future__ import annotations
22-
2321

2422
class BoyerMooreSearch:
23+
"""
24+
Example usage:
25+
26+
bms = BoyerMooreSearch(text="ABAABA", pattern="AB")
27+
positions = bms.bad_character_heuristic()
28+
29+
where 'positions' contain the locations where the pattern was matched.
30+
"""
31+
2532
def __init__(self, text: str, pattern: str):
2633
self.text, self.pattern = text, pattern
2734
self.textLen, self.patLen = len(text), len(pattern)
2835

2936
def match_in_pattern(self, char: str) -> int:
30-
"""finds the index of char in pattern in reverse order
37+
"""
38+
Finds the index of char in pattern in reverse order.
3139
3240
Parameters :
3341
char (chr): character to be searched
3442
3543
Returns :
3644
i (int): index of char from last in pattern
3745
-1 (int): if char is not found in pattern
46+
47+
>>> bms = BoyerMooreSearch(text="ABAABA", pattern="AB")
48+
>>> bms.match_in_pattern("B")
49+
1
3850
"""
3951

4052
for i in range(self.patLen - 1, -1, -1):
@@ -44,15 +56,19 @@ def match_in_pattern(self, char: str) -> int:
4456

4557
def mismatch_in_text(self, current_pos: int) -> int:
4658
"""
47-
find the index of mis-matched character in text when compared with pattern
48-
from last
59+
Find the index of mis-matched character in text when compared with pattern
60+
from last.
4961
5062
Parameters :
5163
current_pos (int): current index position of text
5264
5365
Returns :
5466
i (int): index of mismatched char from last in text
5567
-1 (int): if there is no mismatch between pattern and text block
68+
69+
>>> bms = BoyerMooreSearch(text="ABAABA", pattern="AB")
70+
>>> bms.mismatch_in_text(2)
71+
3
5672
"""
5773

5874
for i in range(self.patLen - 1, -1, -1):
@@ -61,7 +77,14 @@ def mismatch_in_text(self, current_pos: int) -> int:
6177
return -1
6278

6379
def bad_character_heuristic(self) -> list[int]:
64-
# searches pattern in text and returns index positions
80+
"""
81+
Finds the positions of the pattern location.
82+
83+
>>> bms = BoyerMooreSearch(text="ABAABA", pattern="AB")
84+
>>> bms.bad_character_heuristic()
85+
[0, 3]
86+
"""
87+
6588
positions = []
6689
for i in range(self.textLen - self.patLen + 1):
6790
mismatch_index = self.mismatch_in_text(i)
@@ -75,13 +98,7 @@ def bad_character_heuristic(self) -> list[int]:
7598
return positions
7699

77100

78-
text = "ABAABA"
79-
pattern = "AB"
80-
bms = BoyerMooreSearch(text, pattern)
81-
positions = bms.bad_character_heuristic()
101+
if __name__ == "__main__":
102+
import doctest
82103

83-
if len(positions) == 0:
84-
print("No match found")
85-
else:
86-
print("Pattern found in following positions: ")
87-
print(positions)
104+
doctest.testmod()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy