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"