From e39459cbbd8ecf45b67fff141a56fd24cdf5f8ae Mon Sep 17 00:00:00 2001 From: alxkm Date: Wed, 9 Jul 2025 21:57:09 +0200 Subject: [PATCH 1/2] refactor: adding docs for LongestCommonPrefixTest and Parameterized Tests --- .../strings/LongestCommonPrefix.java | 31 ++++++-- .../strings/LongestCommonPrefixTest.java | 74 +++---------------- 2 files changed, 38 insertions(+), 67 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java b/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java index 0fabdaa2658b..1c12a0aebeff 100644 --- a/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java +++ b/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java @@ -2,21 +2,42 @@ import java.util.Arrays; +/** + * Utility class for string operations. + *

+ * This class provides a method to find the longest common prefix (LCP) + * among an array of strings. + *

+ * + * @see Longest Common Prefix - Wikipedia + */ public final class LongestCommonPrefix { - public String longestCommonPrefix(String[] strs) { + + private LongestCommonPrefix() { + } + + /** + * Finds the longest common prefix among a list of strings using lexicographical sorting. + * The prefix is common to the first and last elements after sorting the array. + * + * @param strs array of input strings + * @return the longest common prefix, or empty string if none exists + */ + public static String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) { return ""; } Arrays.sort(strs); - String shortest = strs[0]; - String longest = strs[strs.length - 1]; + String first = strs[0]; + String last = strs[strs.length - 1]; int index = 0; - while (index < shortest.length() && index < longest.length() && shortest.charAt(index) == longest.charAt(index)) { + while (index < first.length() && index < last.length() && + first.charAt(index) == last.charAt(index)) { index++; } - return shortest.substring(0, index); + return first.substring(0, index); } } diff --git a/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java b/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java index 580a2726d285..9d10d63af6da 100644 --- a/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java +++ b/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java @@ -2,72 +2,22 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.api.DisplayName; public class LongestCommonPrefixTest { - private final LongestCommonPrefix longestCommonPrefix = new LongestCommonPrefix(); - - @Test - public void testCommonPrefix() { - String[] input = {"flower", "flow", "flight"}; - String expected = "fl"; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); - } - - @Test - public void testNoCommonPrefix() { - String[] input = {"dog", "racecar", "car"}; - String expected = ""; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); - } - - @Test - public void testEmptyArray() { - String[] input = {}; - String expected = ""; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); - } - - @Test - public void testNullArray() { - String[] input = null; - String expected = ""; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); - } - - @Test - public void testSingleString() { - String[] input = {"single"}; - String expected = "single"; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); - } - - @Test - public void testCommonPrefixWithDifferentLengths() { - String[] input = {"ab", "a"}; - String expected = "a"; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); - } - - @Test - public void testAllSameStrings() { - String[] input = {"test", "test", "test"}; - String expected = "test"; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); - } - - @Test - public void testPrefixAtEnd() { - String[] input = {"abcde", "abcfgh", "abcmnop"}; - String expected = "abc"; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); + @ParameterizedTest(name = "{index} => input={0}, expected=\"{1}\"") + @MethodSource("provideTestCases") + @DisplayName("Test Longest Common Prefix") + void testLongestCommonPrefix(String[] input, String expected) { + assertEquals(expected, LongestCommonPrefix.longestCommonPrefix(input)); } - @Test - public void testMixedCase() { - String[] input = {"Flower", "flow", "flight"}; - String expected = ""; - assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); + private static Stream provideTestCases() { + return Stream.of(Arguments.of(new String[]{"flower", "flow", "flight"}, "fl"), Arguments.of(new String[]{"dog", "racecar", "car"}, ""), Arguments.of(new String[]{}, ""), Arguments.of(null, ""), Arguments.of(new String[]{"single"}, "single"), Arguments.of(new String[]{"ab", "a"}, "a"), Arguments.of(new String[]{"test", "test", "test"}, "test"), Arguments.of(new String[]{"abcde", "abcfgh", "abcmnop"}, "abc"), Arguments.of(new String[]{"Flower", "flow", "flight"}, "")); } } From 630419df319fd2be5db785d4a48ed090ff2c6774 Mon Sep 17 00:00:00 2001 From: alxkm Date: Wed, 9 Jul 2025 22:00:33 +0200 Subject: [PATCH 2/2] checkstyle: fix clang formatting --- .../java/com/thealgorithms/strings/LongestCommonPrefix.java | 3 +-- .../com/thealgorithms/strings/LongestCommonPrefixTest.java | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java b/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java index 1c12a0aebeff..3348b9cf860c 100644 --- a/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java +++ b/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java @@ -33,8 +33,7 @@ public static String longestCommonPrefix(String[] strs) { String last = strs[strs.length - 1]; int index = 0; - while (index < first.length() && index < last.length() && - first.charAt(index) == last.charAt(index)) { + while (index < first.length() && index < last.length() && first.charAt(index) == last.charAt(index)) { index++; } diff --git a/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java b/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java index 9d10d63af6da..84e54f75e8cb 100644 --- a/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java +++ b/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java @@ -3,10 +3,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.api.DisplayName; public class LongestCommonPrefixTest { @@ -18,6 +18,7 @@ void testLongestCommonPrefix(String[] input, String expected) { } private static Stream provideTestCases() { - return Stream.of(Arguments.of(new String[]{"flower", "flow", "flight"}, "fl"), Arguments.of(new String[]{"dog", "racecar", "car"}, ""), Arguments.of(new String[]{}, ""), Arguments.of(null, ""), Arguments.of(new String[]{"single"}, "single"), Arguments.of(new String[]{"ab", "a"}, "a"), Arguments.of(new String[]{"test", "test", "test"}, "test"), Arguments.of(new String[]{"abcde", "abcfgh", "abcmnop"}, "abc"), Arguments.of(new String[]{"Flower", "flow", "flight"}, "")); + return Stream.of(Arguments.of(new String[] {"flower", "flow", "flight"}, "fl"), Arguments.of(new String[] {"dog", "racecar", "car"}, ""), Arguments.of(new String[] {}, ""), Arguments.of(null, ""), Arguments.of(new String[] {"single"}, "single"), Arguments.of(new String[] {"ab", "a"}, "a"), + Arguments.of(new String[] {"test", "test", "test"}, "test"), Arguments.of(new String[] {"abcde", "abcfgh", "abcmnop"}, "abc"), Arguments.of(new String[] {"Flower", "flow", "flight"}, "")); } }