Skip to content

Commit 5f4bb16

Browse files
committed
Add BoyerMoore activity
1 parent 9d3d2c3 commit 5f4bb16

3 files changed

Lines changed: 113 additions & 0 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.packt.datastructuresandalg.lesson5.activity.boyermoore;
2+
3+
import java.util.List;
4+
5+
public class BoyerMoore {
6+
public List<Integer> match(String P, String T) { return null; }
7+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.packt.datastructuresandalg.lesson5.activity.boyermoore.solution;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class BoyerMoore {
7+
public List<Integer> match(String P, String T) {
8+
int n = T.length();
9+
int m = P.length();
10+
11+
int e = 256;
12+
int right[][] = new int[m][e];
13+
for (int i = 0; i < m; i++)
14+
for (int j = 0; j < e; j++)
15+
right[i][j] = -1;
16+
for (int i = 0; i < m; i++) {
17+
if (i != 0)
18+
for (int j = 0; j < e; j++)
19+
right[i][j] = right[i - 1][j];
20+
right[i][P.charAt(i)] = i;
21+
}
22+
23+
int i = m, j = m + 1;
24+
int[] f = new int[m + 1];
25+
int[] s = new int[m + 1];
26+
f[i] = j;
27+
while (i > 0) {
28+
while (j <= m && P.charAt(i - 1) != P.charAt(j - 1)) {
29+
if (s[j] == 0)
30+
s[j] = j - i;
31+
j = f[j];
32+
}
33+
i--; j--;
34+
f[i] = j;
35+
}
36+
37+
j = f[0];
38+
for (i = 0; i <= m; i++) {
39+
if (s[i] == 0)
40+
s[i] = j;
41+
if (i == j)
42+
j = f[j];
43+
}
44+
45+
List<Integer> shifts = new ArrayList<>();
46+
int skip;
47+
for (i = 0; i < n - m + 1; i += skip) {
48+
skip = 0;
49+
boolean hasMatch = true;
50+
for (j = m - 1; j >= 0; j--) {
51+
if (P.charAt(j) != T.charAt(i + j)) {
52+
hasMatch = false;
53+
skip = Math.max(s[j + 1], j - right[j][T.charAt(i + j)]);
54+
break;
55+
}
56+
}
57+
if (hasMatch) {
58+
shifts.add(i);
59+
skip = s[0];
60+
}
61+
}
62+
return shifts;
63+
}
64+
65+
public static void main(String[] args) {
66+
BoyerMoore bm = new BoyerMoore();
67+
List<Integer> matches = bm.match("rabrabracad", "abacadabrabracabracadabrabrabracad");
68+
for (Integer i : matches)
69+
System.out.println(i);
70+
}
71+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.packt.datastructuresandalg.lesson5.activity.boyermoore;
2+
3+
import junit.framework.TestCase;
4+
5+
import java.util.ArrayList;
6+
import java.util.Arrays;
7+
8+
public class BoyerMooreTest extends TestCase {
9+
BoyerMoore bm = new BoyerMoore();
10+
11+
public void test1() {
12+
assertTrue(bm.match("abc", "abc").equals(Arrays.asList(0)));
13+
}
14+
15+
public void test2() {
16+
assertTrue(bm.match("abd", "abc").equals(new ArrayList<>()));
17+
}
18+
19+
public void test3() {
20+
assertTrue(bm.match("abcde", "abc").equals(new ArrayList<>()));
21+
}
22+
23+
public void test4() {
24+
assertTrue(bm.match("aab", "acaabc").equals(Arrays.asList(2)));
25+
}
26+
27+
public void test5() {
28+
assertTrue(bm.match("aab", "acaabcaab").equals(Arrays.asList(2, 6)));
29+
}
30+
31+
public void test6() {
32+
assertTrue(bm.match("rabrabracad", "abacadabrabracabracadabrabrabracad").equals(Arrays.asList(23)));
33+
}
34+
35+
}

0 commit comments

Comments
 (0)