题目描述:
请实现一个函数用来匹配包括'.'和' * '的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"aba"均不匹配
思路分析:
首先判断模式的第二个字符是不是*。
如果不是,则判断字符串的第一个字符和模式的第一个字符是否匹配,如果不匹配则返回false,否则向下继续比较。如果字符串遍历到最后,模式也遍历到最后,那么证明匹配,如果模式遍历到了最后,而字符串没有遍历到最后,则不匹配。
如果是,则分两种情况 ,判断字符串的第一个字符和模式第一个字符是否匹配,如果匹配则可以有以下三种匹配方式:
(1)模式后移两位,相当于x*被忽略(aaa a * aaa)
(2)字符串后移一位,模式后移两位(abc a * bc)
(3)字符串后移一位,模式不变(aaa a*)
如果不匹配,字符串不变,模式后移两位。
代码:
public class Solution {
public boolean match(char[] str, char[] pattern)
{
if(str==null||pattern ==null)
return false;
if(str.length==0&&pattern.length==0)
return true;
return isMatch(str,pattern,0,0);
}
public boolean isMatch(char[]str,char[]pattern,int strIndex,int patternIndex){
if(strIndex==str.length&&patternIndex==pattern.length)
return true; //匹配
if(patternIndex==pattern.length&&strIndex!=str.length)
return false; //不匹配
if(patternIndex+1<pattern.length&&pattern[patternIndex+1]=='*'){ //模式的第二个字符为‘*’
if(strIndex<str.length&&str[strIndex]==pattern[patternIndex]||strIndex<str.length&&pattern[patternIndex]=='.'){//字符串第一个元素和模式中的第一个元素匹配
return isMatch(str,pattern,strIndex,patternIndex+2)|| //aaa a*aaa
isMatch(str,pattern,strIndex+1,patternIndex+2)|| //abc a*bc
isMatch(str,pattern,strIndex+1,patternIndex); //aaa a*
}else{ //字符串的第一个元素和模式中的第一个元素不等
return isMatch(str,pattern,strIndex,patternIndex+2); // abc c*abc
}
}
if(strIndex!=str.length&&pattern[patternIndex]==str[strIndex]||strIndex!=str.length&&pattern[patternIndex]=='.'){ //第二个字符不为*
return isMatch(str,pattern,strIndex+1,patternIndex+1);
}
return false;
}
}