一、递归
第二个字符如果是*,第一个字符可以不匹配(因为*前面的数可以为0次),如果第二个字符不是*,如果第一个字符不匹配就返回flase 所以分为第二个字符是不是*两种情况 :
(1)第二个字符是*时: 如果第一个字符能匹配上,str向后移1位,pattern不动,继续向后匹配 如果第一个字符不能匹配,str不动, pattern向后移2位,继续向后匹配 ;
(2)第二个字符不是*时(或者pattern只剩下1个字符): 如果第一个字符能匹配上,str向后移1位,pattern向后移1位 如果第一个字符不能匹配,返回false ;
结束时,如果pattern为空,str不为空返回false;如果pattern为空,str为空返回true。
class Solution10_1 {
public static boolean isMatch(String s, String p) {
//注意if括号中的是判断p是否为空,而不是s是否为空,,因为如果s为空,p可以不为空,因为*前面那个字符可以是出现0次
if(p.isEmpty()){
return s.isEmpty();
}
//判断第一个字符是否能匹配上,做一个标记
boolean first_match = (s.length() > 0) && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.');
//如果p的长度大于等于2,并且p的第二个字符是*。有两种情况:1.第一个字符匹配不上,s不动P向后移动2个位置,继续比较
//第一个字符能匹配上(first_match),后移动1个位置,p不动,继续比较
//否则,如果p的第二个字符不是*,是普通字符或者是.,先判断第一个字符是否能匹配上,再将s向后移1位,p向后移1位,继续比较
if (p.length() > 1 && p.charAt(1) == '*'){
return isMatch(s, p.substring(2)) || (first_match && isMatch(s.substring(1),p));
}else{
return first_match && isMatch(s.substring(1), p.substring(1));
}
}
}