Skip to content

Commit 622241e

Browse files
Add Z-Algorithm (string pattern matching) with tests
1 parent 2c4bf3c commit 622241e

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

DIRECTORY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,7 @@
821821
- 📄 [Upper](src/main/java/com/thealgorithms/strings/Upper.java)
822822
- 📄 [ValidParentheses](src/main/java/com/thealgorithms/strings/ValidParentheses.java)
823823
- 📄 [WordLadder](src/main/java/com/thealgorithms/strings/WordLadder.java)
824+
- 📄 [ZAlgorithm](src/main/java/com/thealgorithms/strings/ZAlgorithm.java)
824825
- 📁 **zigZagPattern**
825826
- 📄 [ZigZagPattern](src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java)
826827
- 📁 **tree**
@@ -1578,6 +1579,7 @@
15781579
- 📄 [UpperTest](src/test/java/com/thealgorithms/strings/UpperTest.java)
15791580
- 📄 [ValidParenthesesTest](src/test/java/com/thealgorithms/strings/ValidParenthesesTest.java)
15801581
- 📄 [WordLadderTest](src/test/java/com/thealgorithms/strings/WordLadderTest.java)
1582+
- 📄 [ZAlgorithmTest](src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java)
15811583
- 📁 **zigZagPattern**
15821584
- 📄 [ZigZagPatternTest](src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java)
15831585
- 📁 **tree**
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.thealgorithms.strings;
2+
3+
public class ZAlgorithm {
4+
5+
public static int[] zFunction(String s) {
6+
int n = s.length();
7+
int[] z = new int[n];
8+
int l = 0, r = 0;
9+
for (int i = 1; i < n; i++) {
10+
if (i <= r) z[i] = Math.min(r - i + 1, z[i - l]);
11+
while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i])) z[i]++;
12+
if (i + z[i] - 1 > r) {
13+
l = i;
14+
r = i + z[i] - 1;
15+
}
16+
}
17+
return z;
18+
}
19+
20+
public static int search(String text, String pattern) {
21+
String s = pattern + "$" + text;
22+
int[] z = zFunction(s);
23+
int p = pattern.length();
24+
for (int i = 0; i < z.length; i++) {
25+
if (z[i] == p) return i - p - 1;
26+
}
27+
return -1;
28+
}
29+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.thealgorithms.strings;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
import org.junit.jupiter.api.Test;
5+
6+
public class ZAlgorithmTest {
7+
8+
@Test
9+
void testZFunction() {
10+
int[] z = ZAlgorithm.zFunction("aaaaa");
11+
assertArrayEquals(new int[]{0, 4, 3, 2, 1}, z);
12+
}
13+
14+
@Test
15+
void testSearchFound() {
16+
assertEquals(2, ZAlgorithm.search("abcabca", "cab"));
17+
}
18+
19+
@Test
20+
void testSearchNotFound() {
21+
assertEquals(-1, ZAlgorithm.search("abcdef", "gh"));
22+
}
23+
}

0 commit comments

Comments
 (0)