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
Since '*' matches any sequence of characters, we need to check every possibility within string s. Instead of using recursion, we can use iteration with two variables recording position of last '*' in pattern string and corresponding position in string s.
C++ Code:
/* * func: wildcard_match * goal: wildcard pattern match with support for '?' and '*' * @param s: string to be checked * @param p: pattern to be used * return: true or false */ bool wildcard_match(const char* s, const char* p){ if(! *s && ! *p){ return true; } char* start_s = nullptr; char* start_p = nullptr; while(*s != '\0'){ if(*p == *s || *p == '?'){ ++p; ++s; }else if(*p == '*'){ //skip continuous '*' while(*p == '*'){ ++p; } //If '*' is the last letter, return true if(*p == '\0'){ return true; } start_p = const_cast<char*>(p); start_s = const_cast<char*>(s); }else if((*p != '\0' || *p != *s) && start_p != nullptr){ //If current char is not matched, include it to the * and backtrace s = ++start_s; p = start_p; }else{ return false; } } //Check if remaining part of pattern is all of '*' while(*p != '\0'){ if(*p++ != '*'){ return false; } } return true; }
Python Code:
# func: wildcard pattern match with support for '?' and '*' # @param s: an input string # @param p: a pattern string # @return: True or False def wildcard_match(s, p): s_index = 0 p_index = 0 star = -1 while s_index < len(s) and p_index <= len(p): if p_index != len(p): if p[p_index] == '?' or p[p_index] == s[s_index]: s_index += 1 p_index += 1 continue if p[p_index] == '*': star = p_index p_index += 1 #Record the current index of s when a '*' occur in p s_star = s_index continue if star != -1: p_index = star + 1 s_index = s_star + 1 s_star += 1 continue return False #Remove '*' in the remaining part while p_index < len(p) and p[p_index] == '*': p_index += 1 if p_index == len(p): if s_index == len(s): return True else: return False else: return False
Reference Link:
[closed] Wildcard Matching - LeetCode http://discuss.leetcode.com/questions/222/wildcard-matching