'.' Matches any single character. '*' Matches zero or more of the preceding element. 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", "a*") → true isMatch("aa", ".*") → true isMatch("ab", ".*") → true isMatch("aab", "c*a*b") → true
#include <string>
#include <iostream>
using namespace std;
/*
Explain:
1: the key point to solve the problem is to get the '*' position.
Suppose, the j + 1 position is not '*', it is easly to handle.
if s[i] == p[j] || s[i] is any char, p[j] == '.'
Example ------> "aabc", "aa.c"
we need to match the s, i + 1, p, j + 1 left characters.
However, if the j + 1 position is '*', we need to list several cases.
2.1: if s[i] == p[j] && p[j+1] == '*', * is repeating of s[i] char.
Example -----> "aaaaaa" "a*"
we need to either match (s, i, p, j+2) or i is always increasing...
2.2: if p[j] == '.', s[i] is any char
Example ----> "aaaaaa" "a.*"
Example ----> "aaabc" "a.*bc"
we need to match (s, i, p, j + 2) || i is always increasing... ".*" can match any char.
2.3 is neither happen, it must be this case "bb" "a*bb"
we need to match (s, i, p, j + 2)
*/
bool isMatch(string s, int i, string p, int j) {
if(i == s.size()) return j == p.size();
if(p[j+1] != '*') {
if(s[i] == p[j] || (i != s.size() && p[j] == '.'))
return isMatch(s, i + 1, p, j + 1);
return false;
} else {
while(s[i] == p[j] || (p[j] == '.' && i != s.size())) {
if(isMatch(s, i, p, j + 2)) return true;
i++;
}
return isMatch(s, i, p, j + 2);
}
}
bool isMatch(string s, string p) {
return isMatch(s, 0, p, 0);
}
int main(void) {
cout << isMatch("bb", "a*bb") << endl;
-- INSERT --