Skip to content
Closed
58 changes: 58 additions & 0 deletions src/main/java/com/thealgorithms/searches/BoyerMoore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.thealgorithms.searches;

/**
* Boyer-Moore string search algorithm.
* Efficient algorithm for substring search.
* https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm
*/
public class BoyerMoore {

private final int R; // Radix
private final int[] right; // Bad character rule table
private final String pattern;

public BoyerMoore(String pat) {
this.pattern = pat;
this.R = 256;
this.right = new int[R];

for (int c = 0; c < R; c++) {
right[c] = -1;
}

for (int j = 0; j < pat.length(); j++) {
right[pat.charAt(j)] = j;
}
}

public int search(String text) {
if (pattern.isEmpty()) {
return 0;
}

int m = pattern.length();
int n = text.length();

int skip;
for (int i = 0; i <= n - m; i += skip) {
skip = 0;
for (int j = m - 1; j >= 0; j--) {
char txtChar = text.charAt(i + j);
char patChar = pattern.charAt(j);
if (patChar != txtChar) {
skip = Math.max(1, j - right[txtChar]);
break;
}
}
if (skip == 0) {
return i; // Match found
}
}

return -1; // No match
}

public static int search(String text, String pattern) {
return new BoyerMoore(pattern).search(text);
}
}
55 changes: 55 additions & 0 deletions src/test/java/com/thealgorithms/searches/BoyerMooreTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.thealgorithms.searches;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

public class BoyerMooreTest {

@Test
public void testPatternFound() {
BoyerMoore bm = new BoyerMoore("ABCDABD");
String text = "ABC ABCDAB ABCDABCDABDE";
int index = bm.search(text);
assertEquals(15, index);
}

@Test
public void testPatternNotFound() {
BoyerMoore bm = new BoyerMoore("XYZ");
String text = "ABC ABCDAB ABCDABCDABDE";
int index = bm.search(text);
assertEquals(-1, index);
}

@Test
public void testPatternAtBeginning() {
BoyerMoore bm = new BoyerMoore("ABC");
String text = "ABCDEF";
int index = bm.search(text);
assertEquals(0, index);
}

@Test
public void testPatternAtEnd() {
BoyerMoore bm = new BoyerMoore("CDE");
String text = "ABCDEFGCDE";
int index = bm.search(text);
assertEquals(2, index); // Cambiado de 7 a 2
}

@Test
public void testEmptyPattern() {
BoyerMoore bm = new BoyerMoore("");
String text = "Hello world";
int index = bm.search(text);
assertEquals(0, index);
}

@Test
public void testStaticSearchMethod() {
String text = "ABCDEFGCDE";
int index = BoyerMoore.search(text, "CDE");
assertEquals(2, index); // Cambiado de 7 a 2
}
}
Loading