请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
public class Solution {
public boolean match(char[] str, char[] pattern)
{
if(str == null && pattern == null){
return false;
}
if(str == null){
return false;
}
return matchCore(str,0,pattern,0);
}
static boolean matchCore(char[]str,int strStart,char[]pattern,int patternStart){
if(strStart == str.length && patternStart == pattern.length){
return true;
}
if(strStart != str.length && patternStart == pattern.length){
return false;
}
//模式 第二个为 *
if(patternStart+1<pattern.length && pattern[patternStart+1] == '*'){
//str不是空
if(strStart!=str.length){
//当前位匹配 a a*
if( pattern[patternStart] == str[strStart]|| pattern[patternStart]=='.'){
//str 往后一位 ,pattern往后2位
//str 往后一位 ,pattern不变
//str 不动,pattern往后2位
return matchCore(str,strStart+1,pattern,patternStart+2)||
matchCore(str,strStart+1,pattern,patternStart)||
matchCore(str,strStart,pattern,patternStart+2);
}
//不匹配,str不动,patter+2
else{
return matchCore(str,strStart,pattern,patternStart+2);
}
}else{//str为空
return matchCore(str,strStart,pattern,patternStart+2);
}
}
//不是*
//当前匹配
//str不是空
if(strStart !=str.length){
if(pattern[patternStart] == str[strStart] || pattern[patternStart]=='.'){
return matchCore(str,strStart+1,pattern,patternStart+1);
}
}
return false;
}
}
keypoint
考虑pattern第二个为*,不为*的情况
第二个为*的时候
要注意此时可能str已经到结束了,但是pattern还有,那么我们无法操作str,无法比较是否匹配
str不是尾巴,当匹配,有三种情况:
- str 往后一位 ,pattern往后2位
- str 往后一位 ,pattern不变
- str 不动,pattern往后2位
str结束,或者不匹配
str 不动,pattern往后2位
一定要注意str到尾的时候,无法比较是否匹配
第二个不为*的时候
匹配就都+1
否则就是不匹配
也要注意str为尾的时候,此时是无法匹配的