Untitled
Anonymous
plain_text
03/02/2025 10:46 AM
3.0 KB
18
Indexable
public class WildcardMatchingForLoop {
// Recursive function with memoization to check if s1 matches s2
public static boolean isMatch(int i, int j, String s1, String s2, Boolean[][] memo) {
// Base case: Both strings are fully processed
if (i == s1.length() && j == s2.length()) {
return true;
}
// Base case: Pattern is exhausted but string isn't
if (i == s1.length()) {
return false;
}
// Base case: String is exhausted but pattern isn't
if (j == s2.length()) {
// Check if remaining pattern is all '*'
for (int k = i; k < s1.length(); k++) {
if (s1.charAt(k) != '*') {
return false;
}
}
return true;
}
// Return memoized result if it exists
if (memo[i][j] != null) {
return memo[i][j];
}
char p = s1.charAt(i); // Current character in pattern
char s = s2.charAt(j); // Current character in string
if (p == '*') {
// '*' can match zero or more characters
for (int k = j; k <= s2.length(); k++) {
if (isMatch(i + 1, k, s1, s2, memo)) {
memo[i][j] = true;
return true;
}
}
memo[i][j] = false; // If no match is found
} else if (p == '?' || p == s) {
// Match current characters or '?' matches any single character
memo[i][j] = isMatch(i + 1, j + 1, s1, s2, memo);
} else {
// Characters don't match
memo[i][j] = false;
}
return memo[i][j];
}
public static boolean isWildcardMatch(String s1, String s2) {
int n = s1.length();
int m = s2.length();
// Create a memoization table
Boolean[][] memo = new Boolean[n][m];
return isMatch(0, 0, s1, s2, memo);
}
public static void main(String[] args) {
String s1 = "*a*b";
String s2 = "aaabb";
boolean result = isWildcardMatch(s1, s2);
System.out.println("Does the pattern \"" + s1 + "\" match the string \"" + s2 + "\"? " + result);
}
}
Editor is loading...
Leave a Comment