52.正则表达式匹配
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"aba"均不匹配
思路:(吃字符,问题是:吃还是不吃,吃,吃几个?)
**当模式中的第二个字符不是时:**
这种情况比较简单:
①、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。
②、如果字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。
而当模式中的第二个字符是*时:
这种情况就比较复杂了:
如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配,因为是可以表示0个的。
如果字符串第一个字符跟模式第一个字符匹配,因为是比较特殊的,他可以表示0个,也可以表示1个,也可以表示多个,我们需要考虑所有的情况,就有3种匹配方式:
①、模式后移2字符,相当于x被忽略,字符不后移;
②、字符串后移1字符,模式后移2字符;
③、字符串后移1字符,模式不变,即继续匹配字符下一位,因为可以匹配多位;
public class Solution {
public boolean match(char[] str, char[] pattern)
{
//两个字符串都为空,返回true
if(str==null&&pattern==null) return true;
//第一个字符串非空,第二个字符串空。匹配失败
if(str!=null&&pattern==null) return false;
//接下来不需要立刻判断第一个字符为空,第二个字符串非空的情况
//因为如果第一个字符串为空,而第二个字符串为‘a*’.这样的话就可以匹配成功。
//说明此时并不能立刻得出判断的结果。需要进行分类讨论了
int strIndex=0;
int patternIndex=0;
return pipei(str,strIndex,pattern,patternIndex);
}
private boolean pipei(char[] str,int strIndex,char[] pattern,int patternIndex){
//两者都走到最后了,说明匹配成功
if(strIndex==str.length&&patternIndex==pattern.length){
return true;
}
//模式走到最后但是字符串还没有,说明匹配失败
if(strIndex!=str.length&&patternIndex==pattern.length){
return false;
}
//如果模式串下一个字符为*
if(patternIndex<pattern.length-1&&pattern[patternIndex+1]=='*'){
//如果当前字符匹配.匹配分为直接字符匹配和‘.’匹配
if((strIndex!=str.length&&str[strIndex]==pattern[patternIndex])
||(strIndex!=str.length&&pattern[patternIndex]=='.')){
//匹配了之后有三种选择的路,递归下去一直匹配到最后
return pipei(str,strIndex,pattern,patternIndex+2)||//模式后移2,视为x*匹配0个字符
pipei(str,strIndex+1,pattern,patternIndex+2)||//视为模式匹配1个字符
pipei(str,strIndex+1,pattern,patternIndex);//*匹配1个,再匹配str中的下一个
}
//一开始跟*之前的字符就不匹配的话,就忽略这个*和*之前的字符,直接尝试匹配下个字符
else{
return pipei(str,strIndex,pattern,patternIndex+2);
}
}
//模式串下一个字符不为*,并且匹配的话就都往后移动一格
if((strIndex!=str.length&&str[strIndex]==pattern[patternIndex])
||(strIndex!=str.length&&pattern[patternIndex]=='.')){
return pipei(str,strIndex+1,pattern,patternIndex+1);
}
return false;
}
}
方法2:投机取巧法,直接利用字符串的正则匹配
public class Solution {
public boolean match(char[] str, char[] pattern){
String ss = new String(str);
String sp = new String(pattern);
return ss.matches(sp);
}
}