Comparing from the right end
At a candidate alignment, comparisons begin at the pattern’s right end. A mismatch can justify moving more than one position by identifying the next alignment that could still match.
A full comparison establishes an occurrence. Larger shifts are correct only when skipped alignments are impossible. Their benefit comes from justified exclusion rather than simply omitting checks and assuming correctness.
References: [1]
Bad characters and good suffixes
The bad-character rule examines the mismatching text character’s position in the pattern. Princeton records each character’s rightmost occurrence and computes a shift of at least one; an absent character can rule out many positions.
The good-suffix rule instead reuses the already matched tail, seeking compatible internal occurrences or prefix overlap. These are different sources of information. Princeton’s BoyerMoore.java explicitly implements only bad-character shifting, not the strong good-suffix rule.
Repetitive text and implementation limits
Shifts can greatly reduce inspections on ordinary text, but bad-character-only versions still have poor worst cases, especially with repetition. Frequent large jumps do not establish a universal sublinear bound or the guarantees of an enhanced variant.
Lookup tables must cover the actual alphabet; a 256-entry example does not directly index arbitrary Unicode values. Analysis should state the rule set, encoding, match-reporting policy and whether preprocessing is reused across queries.