Regular Expression Matching
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
说明:*号之前的字符可以出现多次,比如说a*b可以和ab也可以和aab匹配,甚至也可以和b匹配,因为a可以出现0次。
public class Solution {
public boolean isMatch(String s, String p) {
return toMatch(s,p,0,0);
}
//detemine whether substring(i,s,length()) and substring(j,p.length()) are matching or not under the condition of s(0,i) and
//p(0,j) are alreadly matching.
public boolean toMatch(String s,String p,int i,int j){
//if j is beyond the last one, only i is beyond last one ,then return true.
if(j>=p.length()){
return i>=s.length();
}
//if j is the last one
else if(j == p.length()-1){
//only i is the last one and {s(i)==p(j) or p(j)=='.'}, then return true;
if(i==s.length()-1&&(s.charAt(i)==p.charAt(j)||p.charAt(j)=='.')){
return true;
}
else{
return false;
}
}
else{
//case1:p(j+1) is not '*'
if(p.charAt(j+1)!='*'){
//if no more i to match, retrun false.
if(i>=s.length()){
return false;
}
else{
//if s(i)==p(j) or p(j) =='.', it means s(i) and p(j) are matching, to judge the rest s(i+1...) and p(j+1...).
if(p.charAt(j)==s.charAt(i)||p.charAt(j)=='.'){
return toMatch(s,p,i+1,j+1);
}
//s(i) and p(j) are nor matching ,directly return false.
else{
return false;
}
}
}
else{
//case2:specially, p(j+1) == '*'.
//case2.1:if s(i...) and p(j+2...) and matching, a char & '*' can stand for 0 element
if(toMatch(s,p,i,j+2)){
return true;
}
else{
int k = i;
//case 2.2: a char & '*' can stand for 1 or more preceding element,
//so try every sub string
while(k<s.length()&&(k < 0 || s.charAt(k)== p.charAt(j)||p.charAt(j)=='.')){
if(toMatch(s,p,k+1,j+2)){
return true;
}
k++;
}
return false;
}
}
}
}
}