Implement wildcard pattern matching with support for '?'
and '*'
.
'?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the entire input string (not partial). The function prototype should be: bool isMatch(const char *s, const char *p) Some examples: isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → true isMatch("aab", "c*a*b") → false
Two pointers..
https://leetcode.com/discuss/10133/linear-runtime-and-constant-space-solution
public class Solution {
public boolean isMatch(String s, String p) {
int i = 0, j = 0, starIdx = -1, match = 0;
while( i < s.length()){
// if current s[i] and p[j] match, s & both move forward
if(j < p.length() && (p.charAt(j) == '?' || p.charAt(j) == s.charAt(i))){
i++;
j++;
}
// if p[j] is '*', mark index of '*' and current match index of s, which is current i, j++ which means current * is empty sequence
else if(j < p.length() && p.charAt(j) == '*'){
starIdx = j;
match = i;
j++;
}
// current s[i] and p[j] does not match,
// and p[j] is not '*', then we'll see if there is any '*' in front of current j,
// if not, return false,
// if there is a '*', then move j back to the next char of '*', and move i back to the next of match position,
// which is equal to '*' is matching only one character of s[match],
// if the next loop still same case as this one, then the '*' will match two characters after match in s, and so on...
else if(starIdx != -1){
j = starIdx + 1;
match++;
i = match;
}else{
// here is the case: p[j] and s[i] doesn't match;
// p[j] is not '*'; no '*' before current j. return false;
return false;
}
}
while(j < p.length() && p.charAt(j) == '*'){
j++;
}
return j == p.length();
}
}
Time complexity is O(n ^ 2) ?.. not sure
Quote:
it is O(m*n) in worst cases, consider below input:
s = "aaaaaaaaaaaaaaaaaaaa"
p = "*aaaaaaaaaaaaaaaaaab"