From fa5dc2078b5b53b168f3e9911d36a659c7c407eb Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 7 Oct 2024 15:30:15 +0530 Subject: [PATCH 1/4] Add `WordPatternMatcher.java` new algorithm --- .../backtracking/WordPatternMatcher.java | 85 +++++++++++++++++++ .../backtracking/WordPatternMatcherTest.java | 40 +++++++++ 2 files changed, 125 insertions(+) create mode 100644 src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java create mode 100644 src/test/java/com/thealgorithms/backtracking/WordPatternMatcherTest.java diff --git a/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java b/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java new file mode 100644 index 000000000000..394d22e7ea30 --- /dev/null +++ b/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java @@ -0,0 +1,85 @@ +package com.thealgorithms.backtracking; + +import java.util.HashMap; +import java.util.Map; + +/** + * Class to determine if a pattern matches a string using backtracking. + * + * Example: + * Pattern: "abab" + * Input String: "JavaPythonJavaPython" + * Output: true + * + * Pattern: "aaaa" + * Input String: "JavaJavaJavaJava" + * Output: true + * + * Pattern: "aabb" + * Input String: "JavaPythonPythonJava" + * Output: false + */ +public class WordPatternMatcher { + + /** + * Determines if the given pattern matches the input string using backtracking. + * + * @param pattern The pattern to match. + * @param inputString The string to match against the pattern. + * @return True if the pattern matches the string, False otherwise. + */ + public static boolean matchWordPattern(String pattern, String inputString) { + Map patternMap = new HashMap<>(); + Map strMap = new HashMap<>(); + return backtrack(pattern, inputString, 0, 0, patternMap, strMap); + } + + /** + * Backtracking helper function to check if the pattern matches the string. + * + * @param pattern The pattern string. + * @param inputString The string to match against the pattern. + * @param patternIndex Current index in the pattern. + * @param strIndex Current index in the input string. + * @param patternMap Map to store pattern characters to string mappings. + * @param strMap Map to store string to pattern character mappings. + * @return True if the pattern matches, False otherwise. + */ + private static boolean backtrack(String pattern, String inputString, int patternIndex, int strIndex, + Map patternMap, Map strMap) { + if (patternIndex == pattern.length() && strIndex == inputString.length()) { + return true; + } + if (patternIndex == pattern.length() || strIndex == inputString.length()) { + return false; + } + + char currentChar = pattern.charAt(patternIndex); + if (patternMap.containsKey(currentChar)) { + String mappedStr = patternMap.get(currentChar); + if (inputString.startsWith(mappedStr, strIndex)) { + return backtrack(pattern, inputString, patternIndex + 1, strIndex + mappedStr.length(), patternMap, strMap); + } else { + return false; + } + } + + for (int end = strIndex + 1; end <= inputString.length(); end++) { + String substring = inputString.substring(strIndex, end); + if (strMap.containsKey(substring)) { + continue; + } + + patternMap.put(currentChar, substring); + strMap.put(substring, currentChar); + if (backtrack(pattern, inputString, patternIndex + 1, end, patternMap, strMap)) { + return true; + } + + patternMap.remove(currentChar); + strMap.remove(substring); + } + + return false; + } +} diff --git a/src/test/java/com/thealgorithms/backtracking/WordPatternMatcherTest.java b/src/test/java/com/thealgorithms/backtracking/WordPatternMatcherTest.java new file mode 100644 index 000000000000..4d56be566035 --- /dev/null +++ b/src/test/java/com/thealgorithms/backtracking/WordPatternMatcherTest.java @@ -0,0 +1,40 @@ +package com.thealgorithms.backtracking; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class WordPatternMatcherTest { + + @Test + public void testPatternMatchingSuccess() { + assertTrue(WordPatternMatcher.matchWordPattern("aba", "GraphTreesGraph")); + assertTrue(WordPatternMatcher.matchWordPattern("xyx", "PythonRubyPython")); + } + + @Test + public void testPatternMatchingFailure() { + assertFalse(WordPatternMatcher.matchWordPattern("GG", "PythonJavaPython")); + } + + @Test + public void testEmptyPatternAndString() { + assertTrue(WordPatternMatcher.matchWordPattern("", "")); + } + + @Test + public void testEmptyPattern() { + assertFalse(WordPatternMatcher.matchWordPattern("", "nonempty")); + } + + @Test + public void testEmptyString() { + assertFalse(WordPatternMatcher.matchWordPattern("abc", "")); + } + + @Test + public void testLongerPatternThanString() { + assertFalse(WordPatternMatcher.matchWordPattern("abcd", "abc")); + } +} From 2cf019d9573a5ff95ded9e3ee295346ec83d89f0 Mon Sep 17 00:00:00 2001 From: Hardvan Date: Mon, 7 Oct 2024 10:00:35 +0000 Subject: [PATCH 2/4] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 1bad5d3b98a3..6fc2f2a75310 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -19,6 +19,7 @@ * [Permutation](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/backtracking/Permutation.java) * [PowerSum](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/backtracking/PowerSum.java) * [SubsequenceFinder](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/backtracking/SubsequenceFinder.java) + * [WordPatternMatcher](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java) * [WordSearch](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/backtracking/WordSearch.java) * bitmanipulation * [BitSwap](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/bitmanipulation/BitSwap.java) @@ -603,6 +604,7 @@ * [PermutationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/PermutationTest.java) * [PowerSumTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/PowerSumTest.java) * [SubsequenceFinderTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/SubsequenceFinderTest.java) + * [WordPatternMatcherTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/WordPatternMatcherTest.java) * [WordSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/WordSearchTest.java) * bitmanipulation * [BitSwapTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/bitmanipulation/BitSwapTest.java) From d7961552e8e0eddd9d3ffa5fbf0ef6a97dea3002 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 7 Oct 2024 15:33:11 +0530 Subject: [PATCH 3/4] Fix --- .../com/thealgorithms/backtracking/WordPatternMatcher.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java b/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java index 394d22e7ea30..0fe6dbfb7820 100644 --- a/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java +++ b/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java @@ -45,8 +45,7 @@ public static boolean matchWordPattern(String pattern, String inputString) { * @param strMap Map to store string to pattern character mappings. * @return True if the pattern matches, False otherwise. */ - private static boolean backtrack(String pattern, String inputString, int patternIndex, int strIndex, - Map patternMap, Map strMap) { + private static boolean backtrack(String pattern, String inputString, int patternIndex, int strIndex, Map patternMap, Map strMap) { if (patternIndex == pattern.length() && strIndex == inputString.length()) { return true; } From d9e1434152393d3edbc9d1aa869b5931308fea72 Mon Sep 17 00:00:00 2001 From: Hardik Pawar Date: Mon, 7 Oct 2024 15:33:38 +0530 Subject: [PATCH 4/4] Fix --- .../com/thealgorithms/backtracking/WordPatternMatcher.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java b/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java index 0fe6dbfb7820..1854cab20a7f 100644 --- a/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java +++ b/src/main/java/com/thealgorithms/backtracking/WordPatternMatcher.java @@ -19,7 +19,9 @@ * Input String: "JavaPythonPythonJava" * Output: false */ -public class WordPatternMatcher { +public final class WordPatternMatcher { + private WordPatternMatcher() { + } /** * Determines if the given pattern matches the input string using backtracking.