Sponsored
Sponsored
The dynamic programming approach uses a 2D table to store results of subproblems. We define dp[i][j] as True if the first i characters in the string s can be matched by the first j characters of the pattern p.
Base Cases:
Fill the table using the following rules:
Time Complexity: O(m*n) where m and n are the lengths of s and p, respectively.
Space Complexity: O(m*n) due to the storage of the dp table.
1public class Solution {
2 public boolean isMatch(String s, String p) {
3 int m = s.length();
4The core idea is the same dynamic programming approach. The Java implementation makes use of arrays to store intermediate match results for substrings of s and p.
The greedy algorithm approach tracks the position of the last '*' in the pattern and attempts to match remaining characters greedily. We maintain two pointers, one for the string and one for the pattern. When encountering '*', we remember the positions of both pointers in order to backtrack if needed.
If characters in p and s match or if the pattern has '?', both pointers are incremented. For '*', we shift the pattern pointer and remember indices for future potential matches. If there's a mismatch after '*', we use these remembered indices to backtrack.
Time Complexity: O(m + n) due to possible backtracking
Space Complexity: O(1) requiring constant storage for indices.
using namespace std;
class Solution {
public:
bool isMatch(string s, string p) {
int sLen = s.length();
int pLen = p.length();
int sIdx = 0, pIdx = 0;
int starIdx = -1, sTmpIdx = -1;
while (sIdx < sLen) {
if (pIdx < pLen && (p[pIdx] == '?' || s[sIdx] == p[pIdx])) {
sIdx++;
pIdx++;
} else if (pIdx < pLen && p[pIdx] == '*') {
starIdx = pIdx;
sTmpIdx = sIdx;
pIdx++;
} else if (starIdx == -1) {
return false;
} else {
pIdx = starIdx + 1;
sTmpIdx++;
sIdx = sTmpIdx;
}
}
for (int i = pIdx; i < pLen; i++) {
if (p[i] != '*') return false;
}
return true;
}
};
The C++ solution executes a greedy exploration, leveraging indices tracking similar to the C solution. This aids in addressing pattern shifts without excess storage usage.