题目要求:请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符(前一个)可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。
解题方法:使用递归解决方法
首先第一种情况:待匹配字符串为空,正则字符串只能为空或者为偶数(abc* 情形),且正则字符串的偶数位必须为* 限定
第二种情况:若待匹配字符串不为空,当正则字符串为空,则不匹配(递归结束条件)
递归:得到两个字符串的当前位字符,c1(待匹配字符串的当前位)和c2(正则字符串的当前位),用c3表示正则字符串当前位的下一位(判断是否为 * 分情况)
若c3是 *,看当前位置c1,c2是否匹配,若匹配,将字符串减一位进行递归判断
class Solution {
public boolean isMatch(String s, String p) {
//情况1:字符串s的长度为0
if(s.length()==0){
//如果正则字符串的长度为奇数,肯定不匹配 因为要么是空,要么是(a*b*c*)
if(p.length()%2!=0){return false;}
//如果正则字符串不是这种形式(a*b*)也不匹配
int i=1;
while(i<p.length()){
//当偶数为有一个不为*号,则无法匹配空串
if(p.charAt(i)!='*')return false;
i+=2;
}
//若满足条件匹配空串成功
return true;
}
//情况2:字符串s长度不为0,但是正则字符串长度为0,直接返回错误
if(p.length()==0) return false;
//情况3:得到s字符串与p正则字符串的当前位字符 分别为c1,c2.
// c3则为正则字符串当前位的下一个字符串(如果存在)
char c1=s.charAt(0),c2=p.charAt(0),c3='a';
if(p.length()>1){
c3=p.charAt(1);
}
//正则字符串:当前位的下一个字符不为*
if(c3!='*'){
if(c1==c2||c2=='.'){
//当前位置匹配,递归判断下一位,
return isMatch(s.substring(1),p.substring(1));
}else{return false;}
}else{
//正则字符串: 当前位的下一个字符为*
if(c1==c2||c2=='.'){
//因为(某个字符*)代表该字符出现0次或无数次,所以看或者不看该正则
return isMatch(s.substring(1),p)||isMatch(s,p.substring(2));
}else{
//如果第一个字符就不匹配,直接不看该正则
return isMatch(s,p.substring(2));
}
}
}
}