diff --git a/DIRECTORY.md b/DIRECTORY.md index 833062d17..ac2e921e6 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -686,6 +686,7 @@ * [Isomorphic](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/strings/Isomorphic.java) * [KMP](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/strings/KMP.java) * [LetterCombinationsOfPhoneNumber](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/strings/LetterCombinationsOfPhoneNumber.java) + * [LongestCommonPrefix](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java) * [LongestNonRepetitiveSubstring](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/strings/LongestNonRepetitiveSubstring.java) * [LongestPalindromicSubstring](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/strings/LongestPalindromicSubstring.java) * [Lower](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/strings/Lower.java) @@ -1311,6 +1312,7 @@ * [HorspoolSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/strings/HorspoolSearchTest.java) * [IsomorphicTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/strings/IsomorphicTest.java) * [LetterCombinationsOfPhoneNumberTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/strings/LetterCombinationsOfPhoneNumberTest.java) + * [LongestCommonPrefixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java) * [LongestNonRepetitiveSubstringTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/strings/LongestNonRepetitiveSubstringTest.java) * [LongestPalindromicSubstringTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/strings/LongestPalindromicSubstringTest.java) * [LowerTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/strings/LowerTest.java) diff --git a/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java b/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java new file mode 100644 index 000000000..0fabdaa26 --- /dev/null +++ b/src/main/java/com/thealgorithms/strings/LongestCommonPrefix.java @@ -0,0 +1,22 @@ +package com.thealgorithms.strings; + +import java.util.Arrays; + +public final class LongestCommonPrefix { + public String longestCommonPrefix(String[] strs) { + if (strs == null || strs.length == 0) { + return ""; + } + + Arrays.sort(strs); + String shortest = strs[0]; + String longest = strs[strs.length - 1]; + + int index = 0; + while (index < shortest.length() && index < longest.length() && shortest.charAt(index) == longest.charAt(index)) { + index++; + } + + return shortest.substring(0, index); + } +} diff --git a/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java b/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java new file mode 100644 index 000000000..580a2726d --- /dev/null +++ b/src/test/java/com/thealgorithms/strings/LongestCommonPrefixTest.java @@ -0,0 +1,73 @@ +package com.thealgorithms.strings; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +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)); + } + + @Test + public void testMixedCase() { + String[] input = {"Flower", "flow", "flight"}; + String expected = ""; + assertEquals(expected, longestCommonPrefix.longestCommonPrefix(input)); + } +}