1、题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
2、思路
当模式串中第二个字符是‘*’时,分三种情况:
(1)模式串向后移动两个字符,这相当于‘*’和它前面的字符被忽略了。
(2)如果模式串中的第一个字符和字符串中的第一个字符相匹配,则在字符串上向后移动一个字符,而在模式串上有两种选择:可以保持模式串不变,也可以在模式串上向后移动两个字符。
当模式串中第二个字符不适‘*’时:
如果字符串的第一个字符和模式串的第一个字符相匹配,那么在字符串和模式串上都向后移动一个字符,然后匹配剩余的字符串和模式。
3、代码
public boolean match(char[] str, char[] pattern)
{
if(str==null || pattern==null){
return false;
}
return matchCore(str,pattern,0,0);
}
public boolean matchCore(char[] str,char []pattern,int s,int p){
if(s==str.length && p==pattern.length){
return true;
}
if(s!=str.length && p==pattern.length){
return false;
}
if(p<pattern.length-1 && pattern[p+1]=='*' ){
if((s<str.length&&pattern[p]==str[s]) || (pattern[p]=='.'&& s<str.length)){//解决字符串length为‘0’的情况,必须将s<str.length写在这里
return matchCore(str,pattern,s+1,p+2)||matchCore(str,pattern,s+1,p)
|| matchCore(str,pattern,s,p+2);
}else{
return matchCore(str,pattern,s,p+2);
}
}
if(s<str.length && p<pattern.length){
if(pattern[p]==str[s] || pattern[p]=='.'){
return matchCore(str,pattern,s+1,p+1);
}
}
return false;
}