From 622241ed3e034baf5cf52228e75ae1cb2dfc96c1 Mon Sep 17 00:00:00 2001 From: "utkarshishu2627@gmail.com" Date: Wed, 26 Nov 2025 07:12:36 +0530 Subject: [PATCH 1/5] Add Z-Algorithm (string pattern matching) with tests --- DIRECTORY.md | 2 ++ .../com/thealgorithms/strings/ZAlgorithm.java | 29 +++++++++++++++++++ .../thealgorithms/strings/ZAlgorithmTest.java | 23 +++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 src/main/java/com/thealgorithms/strings/ZAlgorithm.java create mode 100644 src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java diff --git a/DIRECTORY.md b/DIRECTORY.md index 042efa72addc..c278b6915d49 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -821,6 +821,7 @@ - 📄 [Upper](src/main/java/com/thealgorithms/strings/Upper.java) - 📄 [ValidParentheses](src/main/java/com/thealgorithms/strings/ValidParentheses.java) - 📄 [WordLadder](src/main/java/com/thealgorithms/strings/WordLadder.java) + - 📄 [ZAlgorithm](src/main/java/com/thealgorithms/strings/ZAlgorithm.java) - 📁 **zigZagPattern** - 📄 [ZigZagPattern](src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java) - 📁 **tree** @@ -1578,6 +1579,7 @@ - 📄 [UpperTest](src/test/java/com/thealgorithms/strings/UpperTest.java) - 📄 [ValidParenthesesTest](src/test/java/com/thealgorithms/strings/ValidParenthesesTest.java) - 📄 [WordLadderTest](src/test/java/com/thealgorithms/strings/WordLadderTest.java) + - 📄 [ZAlgorithmTest](src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java) - 📁 **zigZagPattern** - 📄 [ZigZagPatternTest](src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java) - 📁 **tree** diff --git a/src/main/java/com/thealgorithms/strings/ZAlgorithm.java b/src/main/java/com/thealgorithms/strings/ZAlgorithm.java new file mode 100644 index 000000000000..951f31ddd19d --- /dev/null +++ b/src/main/java/com/thealgorithms/strings/ZAlgorithm.java @@ -0,0 +1,29 @@ +package com.thealgorithms.strings; + +public class ZAlgorithm { + + public static int[] zFunction(String s) { + int n = s.length(); + int[] z = new int[n]; + int l = 0, r = 0; + for (int i = 1; i < n; i++) { + if (i <= r) z[i] = Math.min(r - i + 1, z[i - l]); + while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i])) z[i]++; + if (i + z[i] - 1 > r) { + l = i; + r = i + z[i] - 1; + } + } + return z; + } + + public static int search(String text, String pattern) { + String s = pattern + "$" + text; + int[] z = zFunction(s); + int p = pattern.length(); + for (int i = 0; i < z.length; i++) { + if (z[i] == p) return i - p - 1; + } + return -1; + } +} diff --git a/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java b/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java new file mode 100644 index 000000000000..6cd0eeb3c901 --- /dev/null +++ b/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java @@ -0,0 +1,23 @@ +package com.thealgorithms.strings; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +public class ZAlgorithmTest { + + @Test + void testZFunction() { + int[] z = ZAlgorithm.zFunction("aaaaa"); + assertArrayEquals(new int[]{0, 4, 3, 2, 1}, z); + } + + @Test + void testSearchFound() { + assertEquals(2, ZAlgorithm.search("abcabca", "cab")); + } + + @Test + void testSearchNotFound() { + assertEquals(-1, ZAlgorithm.search("abcdef", "gh")); + } +} From 7d21bea7f0fdc7aab529fee7e01e0e752b92d77d Mon Sep 17 00:00:00 2001 From: "utkarshishu2627@gmail.com" Date: Wed, 26 Nov 2025 07:26:07 +0530 Subject: [PATCH 2/5] Add Z-Algorithm (string pattern matching) with tests --- src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java b/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java index 6cd0eeb3c901..d1aa5f077ec1 100644 --- a/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java +++ b/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java @@ -1,3 +1,6 @@ +/* + * https://en.wikipedia.org/wiki/Z-algorithm + */ package com.thealgorithms.strings; import static org.junit.jupiter.api.Assertions.*; @@ -8,7 +11,7 @@ public class ZAlgorithmTest { @Test void testZFunction() { int[] z = ZAlgorithm.zFunction("aaaaa"); - assertArrayEquals(new int[]{0, 4, 3, 2, 1}, z); + assertArrayEquals(new int[] { 0, 4, 3, 2, 1 }, z); } @Test From 935d9e8944a01bb2e6d878f78707285dbe7f03cd Mon Sep 17 00:00:00 2001 From: "utkarshishu2627@gmail.com" Date: Wed, 26 Nov 2025 07:27:07 +0530 Subject: [PATCH 3/5] Add Z-Algorithm (string pattern matching) with tests --- .../java/com/thealgorithms/strings/ZAlgorithm.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/ZAlgorithm.java b/src/main/java/com/thealgorithms/strings/ZAlgorithm.java index 951f31ddd19d..81d1ae70cd6a 100644 --- a/src/main/java/com/thealgorithms/strings/ZAlgorithm.java +++ b/src/main/java/com/thealgorithms/strings/ZAlgorithm.java @@ -1,3 +1,7 @@ +/* + * https://en.wikipedia.org/wiki/Z-algorithm + */ + package com.thealgorithms.strings; public class ZAlgorithm { @@ -7,8 +11,10 @@ public static int[] zFunction(String s) { int[] z = new int[n]; int l = 0, r = 0; for (int i = 1; i < n; i++) { - if (i <= r) z[i] = Math.min(r - i + 1, z[i - l]); - while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i])) z[i]++; + if (i <= r) + z[i] = Math.min(r - i + 1, z[i - l]); + while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i])) + z[i]++; if (i + z[i] - 1 > r) { l = i; r = i + z[i] - 1; @@ -22,7 +28,8 @@ public static int search(String text, String pattern) { int[] z = zFunction(s); int p = pattern.length(); for (int i = 0; i < z.length; i++) { - if (z[i] == p) return i - p - 1; + if (z[i] == p) + return i - p - 1; } return -1; } From 8e58ef67efa3b0b4e511974d3a72a0686b88aa7f Mon Sep 17 00:00:00 2001 From: "utkarshishu2627@gmail.com" Date: Wed, 26 Nov 2025 07:34:53 +0530 Subject: [PATCH 4/5] Fix checkstyle errors for ZAlgorithm --- .../com/thealgorithms/strings/ZAlgorithm.java | 24 ++++++++++++++----- .../thealgorithms/strings/ZAlgorithmTest.java | 7 +++--- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/ZAlgorithm.java b/src/main/java/com/thealgorithms/strings/ZAlgorithm.java index 81d1ae70cd6a..dc029b751f45 100644 --- a/src/main/java/com/thealgorithms/strings/ZAlgorithm.java +++ b/src/main/java/com/thealgorithms/strings/ZAlgorithm.java @@ -1,25 +1,35 @@ /* * https://en.wikipedia.org/wiki/Z-algorithm */ - package com.thealgorithms.strings; -public class ZAlgorithm { +public final class ZAlgorithm { + + private ZAlgorithm() { + throw new UnsupportedOperationException("Utility class"); + } public static int[] zFunction(String s) { int n = s.length(); int[] z = new int[n]; - int l = 0, r = 0; + int l = 0; + int r = 0; + for (int i = 1; i < n; i++) { - if (i <= r) + if (i <= r) { z[i] = Math.min(r - i + 1, z[i - l]); - while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i])) + } + + while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i])) { z[i]++; + } + if (i + z[i] - 1 > r) { l = i; r = i + z[i] - 1; } } + return z; } @@ -27,9 +37,11 @@ public static int search(String text, String pattern) { String s = pattern + "$" + text; int[] z = zFunction(s); int p = pattern.length(); + for (int i = 0; i < z.length; i++) { - if (z[i] == p) + if (z[i] == p) { return i - p - 1; + } } return -1; } diff --git a/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java b/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java index d1aa5f077ec1..d7e5ae027d28 100644 --- a/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java +++ b/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java @@ -1,9 +1,8 @@ -/* - * https://en.wikipedia.org/wiki/Z-algorithm - */ package com.thealgorithms.strings; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + import org.junit.jupiter.api.Test; public class ZAlgorithmTest { From 4e0c78beda8d2c5fcf083bb4c9eeb7cc3ac5abc3 Mon Sep 17 00:00:00 2001 From: "utkarshishu2627@gmail.com" Date: Wed, 26 Nov 2025 08:15:29 +0530 Subject: [PATCH 5/5] Fix: clang-format and checkstyle compliance for ZAlgorithm --- src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java b/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java index d7e5ae027d28..df749ed9a8b5 100644 --- a/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java +++ b/src/test/java/com/thealgorithms/strings/ZAlgorithmTest.java @@ -10,7 +10,7 @@ public class ZAlgorithmTest { @Test void testZFunction() { int[] z = ZAlgorithm.zFunction("aaaaa"); - assertArrayEquals(new int[] { 0, 4, 3, 2, 1 }, z); + assertArrayEquals(new int[] {0, 4, 3, 2, 1}, z); } @Test