题目描述:
请实现一个函数用来匹配包括 "."和 "*“正则表达式。模式中的字符”.“表示任意一个字符,而”*"表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
这道题其实突破点在于pattern[n+1]是不是 * 号
具体解释见注释
public class Solution {
public boolean match(char[] str,int m,char[] pattern,int n)
{
//两者完全匹配
if(m>=str.length&&n>=pattern.length)
return true;
//str还没匹配完 而模式串已经用完了 说明不匹配
else if(m<str.length&&n>=pattern.length)
return false;
//注意 解决了上面两种情况 接下来的 m的范围还不确定 但 n一定小于pattern.length
//如果pattern[n+1]不越界 并且pattern[n+1]为‘*’
boolean next=(n<pattern.length-1&&pattern[n+1]=='*');
if(next)
{
//分两种情况讨论 即mm<str.length 和 m>=str.length
if(m<str.length)
{
//当前字符不匹配 那只能看*后的字符能不能匹配str了
if(pattern[n]!='.'&&pattern[n]!=str[m])
return match(str,m,pattern,n+2);
//当前字符相等 也不一定就用pattern[n]去匹配 比如 "a" "a*a" 肯定用*后的a去匹配 所以
else
return match(str,m+1,pattern,n)|| match(str,m,pattern,n+2);
}
//m>=str.length时 就要看 pattern[n]及之后的字符串能不能表示空了
else
return match(str,m,pattern,n+2);
}
//这时候 只需要判断pattern[n]与
else
{
//也是两种情况
if(m<str.length)
{
//不匹配肯定false
if(pattern[n]!='.'&&pattern[n]!=str[m])
return false;
//匹配两者都后移一位 继续下面的匹配
else
return match(str,m+1,pattern,n+1);
}
//这个时候说明pattern后面不能表示空字符串了 只能返回false
else
return false;
}
}
public boolean match(char[] str, char[] pattern)
{
return match(str,0,pattern,0);
}
}