WildcardMatching Added (#4404)
* Added WildcardMatching DP * Wildcard Matching update * Updated WildcardMatching * Added WildcardMatchingTests * WildcardMatching update * Clang-formatting done * WildcardMatching_Clang-formatting done * WildcardMatching
This commit is contained in:
parent
1cf193c7f4
commit
566c27a996
@ -0,0 +1,55 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* Author: Janmesh Singh
|
||||||
|
* Github: https://github.com/janmeshjs
|
||||||
|
|
||||||
|
* Problem Statement: To determine if the pattern matches the text.
|
||||||
|
* The pattern can include two special wildcard characters:
|
||||||
|
* ' ? ': Matches any single character.
|
||||||
|
* ' * ': Matches zero or more of any character sequence.
|
||||||
|
*
|
||||||
|
* Use DP to return True if the pattern matches the entire text and False otherwise
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.thealgorithms.dynamicprogramming;
|
||||||
|
|
||||||
|
public class WildcardMatching {
|
||||||
|
|
||||||
|
public static boolean isMatch(String text, String pattern) {
|
||||||
|
int m = text.length();
|
||||||
|
int n = pattern.length();
|
||||||
|
|
||||||
|
// Create a DP table to store intermediate results
|
||||||
|
boolean[][] dp = new boolean[m + 1][n + 1];
|
||||||
|
|
||||||
|
// Base case: an empty pattern matches an empty text
|
||||||
|
dp[0][0] = true;
|
||||||
|
|
||||||
|
// Handle patterns starting with '*'
|
||||||
|
for (int j = 1; j <= n; j++) {
|
||||||
|
if (pattern.charAt(j - 1) == '*') {
|
||||||
|
dp[0][j] = dp[0][j - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill the DP table
|
||||||
|
for (int i = 1; i <= m; i++) {
|
||||||
|
for (int j = 1; j <= n; j++) {
|
||||||
|
char textChar = text.charAt(i - 1);
|
||||||
|
char patternChar = pattern.charAt(j - 1);
|
||||||
|
|
||||||
|
if (patternChar == textChar || patternChar == '?') {
|
||||||
|
dp[i][j] = dp[i - 1][j - 1];
|
||||||
|
} else if (patternChar == '*') {
|
||||||
|
// '*' can match zero or more characters
|
||||||
|
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
|
||||||
|
} else {
|
||||||
|
dp[i][j] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The result is in the bottom-right cell of the DP table
|
||||||
|
return dp[m][n];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.thealgorithms.dynamicprogramming;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class WildcardMatchingTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMatchingPattern() {
|
||||||
|
assertTrue(WildcardMatching.isMatch("aa", "a*"));
|
||||||
|
assertTrue(WildcardMatching.isMatch("adceb", "*a*b"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNonMatchingPattern() {
|
||||||
|
assertFalse(WildcardMatching.isMatch("cb", "?a"));
|
||||||
|
assertFalse(WildcardMatching.isMatch("acdcb", "a*c?b"));
|
||||||
|
assertFalse(WildcardMatching.isMatch("mississippi", "m*issi*iss?*i"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEmptyPattern() {
|
||||||
|
assertTrue(WildcardMatching.isMatch("", ""));
|
||||||
|
assertFalse(WildcardMatching.isMatch("abc", ""));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user