Topic: Hard(At least I thought)
Question:
Implement regular expression matching with support for '.'
and '*'
.
'.' 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
» Solve this problem
Method:
We traverse these two strings together, and make judgement according to the length of p and its second character. So, we have these situations:
1. p.length is 0, then we check whether s.length is 0.
2. p.length is 1 or the second character of p is not '*', then we check whether s.length is 0 or the first character of p is equals to '.' or first of string s.
3. p.length is longer than 1(of course, the second is '*' is included in this case), and then, we traverse the string s to check whether the traversed characters are fit to the '*' situation. Also, it's a recursive algorithm, and once it fits, it will go to next recursion. Thus, if the recursion comes to a true in the end, it returns true, or, it continues traversing the strings until it meets an end.
Code:
public class Solution {
public boolean isMatch(String s, String p) {
// Start typing your Java solution below
// DO NOT write main() function
if(p.length() == 0) return s.length() == 0;
else if(p.length() == 1 || p.charAt(1) != '*'){
if(s.length() == 0 || (p.charAt(0) != '.' && p.charAt(0) != s.charAt(0)))
return false;
return isMatch(s.substring(1), p.substring(1));
}
else{
int i = -1;
while(i<s.length() && (i<0 || p.charAt(0)==s.charAt(i) || p.charAt(0)=='.')){
if(isMatch(s.substring(i+1), p.substring(2)))
return true;
else
i++;
}
}
return false;
}
}
Summary:
Hard and tricky. Once understood, still time consuming. OK, then.