Skip to content

Commit ee114c8

Browse files
committed
[BAEL-3480] - Java Fast pattern matching using trie and suffix tree
1 parent aa09538 commit ee114c8

2 files changed

Lines changed: 13 additions & 17 deletions

File tree

algorithms-searching/src/main/java/com/baeldung/algorithms/suffixtree/SuffixTree.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,12 @@ public class SuffixTree {
1414
private Node root;
1515
private String fullText;
1616

17-
public SuffixTree() {
17+
public SuffixTree(String text) {
1818
root = new Node("", POSITION_UNDEFINED);
19-
fullText = "";
20-
}
21-
22-
public void addText(String text) {
2319
for (int i = 0; i < text.length(); i++) {
2420
addSuffix(text.substring(i) + WORD_TERMINATION, i);
2521
}
26-
fullText += text;
22+
fullText = text;
2723
}
2824

2925
public List<String> searchText(String pattern) {
@@ -151,20 +147,21 @@ private List<Node> getAllNodesInTraversePath(String pattern, Node startNode, boo
151147
int compareLength = Math.min(nodeText.length(), pattern.length());
152148
for (int j = 1; j < compareLength; j++) {
153149
if (pattern.charAt(j) != nodeText.charAt(j)) {
154-
if (isAllowPartialMatch)
150+
if (isAllowPartialMatch) {
155151
nodes.add(currentNode);
152+
}
156153
return nodes;
157154
}
158155
}
159156

160157
nodes.add(currentNode);
161158
if (pattern.length() > compareLength) {
162159
List<Node> nodes2 = getAllNodesInTraversePath(pattern.substring(compareLength), currentNode, isAllowPartialMatch);
163-
if (nodes2.size() == 0 && !isAllowPartialMatch) {
160+
if (nodes2.size() > 0) {
161+
nodes.addAll(nodes2);
162+
} else if (!isAllowPartialMatch) {
164163
nodes.add(null);
165-
return nodes;
166164
}
167-
nodes.addAll(nodes2);
168165
}
169166
return nodes;
170167
}

algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ public class SuffixTreeUnitTest {
1616

1717
@BeforeClass
1818
public static void setUp() {
19-
suffixTree = new SuffixTree();
20-
suffixTree.addText("bananabanana");
19+
suffixTree = new SuffixTree("havanabanana");
2120
printTree();
2221
}
2322

@@ -26,15 +25,15 @@ public void givenSuffixTree_whenSearchingForA_thenReturn6Matches() {
2625
List<String> matches = suffixTree.searchText("a");
2726
matches.stream()
2827
.forEach(m -> LOGGER.info(m));
29-
Assert.assertArrayEquals(new String[] { "b[a]nanabanana", "ban[a]nabanana", "banan[a]banana", "bananab[a]nana", "bananaban[a]na", "bananabanan[a]" }, matches.toArray());
28+
Assert.assertArrayEquals(new String[] { "h[a]vanabanana", "hav[a]nabanana", "havan[a]banana", "havanab[a]nana", "havanaban[a]na", "havanabanan[a]" }, matches.toArray());
3029
}
3130

3231
@Test
3332
public void givenSuffixTree_whenSearchingForNab_thenReturn1Match() {
3433
List<String> matches = suffixTree.searchText("nab");
3534
matches.stream()
3635
.forEach(m -> LOGGER.info(m));
37-
Assert.assertArrayEquals(new String[] { "bana[nab]anana" }, matches.toArray());
36+
Assert.assertArrayEquals(new String[] { "hava[nab]anana" }, matches.toArray());
3837
}
3938

4039
@Test
@@ -47,18 +46,18 @@ public void givenSuffixTree_whenSearchingForNag_thenReturnNoMatches() {
4746

4847
@Test
4948
public void givenSuffixTree_whenSearchingForBanana_thenReturn2Matches() {
50-
List<String> matches = suffixTree.searchText("banana");
49+
List<String> matches = suffixTree.searchText("ana");
5150
matches.stream()
5251
.forEach(m -> LOGGER.info(m));
53-
Assert.assertArrayEquals(new String[] { "[banana]banana", "banana[banana]" }, matches.toArray());
52+
Assert.assertArrayEquals(new String[] { "hav[ana]banana", "havanab[ana]na", "havanaban[ana]" }, matches.toArray());
5453
}
5554

5655
@Test
5756
public void givenSuffixTree_whenSearchingForNa_thenReturn4Matches() {
5857
List<String> matches = suffixTree.searchText("na");
5958
matches.stream()
6059
.forEach(m -> LOGGER.info(m));
61-
Assert.assertArrayEquals(new String[] { "ba[na]nabanana", "bana[na]banana", "bananaba[na]na", "bananabana[na]" }, matches.toArray());
60+
Assert.assertArrayEquals(new String[] { "hava[na]banana", "havanaba[na]na", "havanabana[na]" }, matches.toArray());
6261
}
6362

6463
@Test

0 commit comments

Comments
 (0)