题目描述
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
代码
public class Solution {
public boolean match(char[] str, char[] pattern)
{
int strN = str.length;
int patternN = pattern.length;
boolean[][] dp = new boolean[strN+1][patternN+1];
for(int i=0; i<=strN; i++){
for(int j=0; j<=patternN; j++){
//非空正则 和 空正则 分为两种情况
if(j == 0){
dp[i][j] = i == 0;
}else{
// 非空分为*和非*
if(pattern[j-1]!='*'){
if(i>0&&(str[i-1]==pattern[j-1]||pattern[j-1]=='.')){
dp[i][j] = dp[i-1][j-1];
}
}else{
//碰到 * 了, 分为看和不看
//不看 直接砍掉正则串的后面两个 f[i][j]=f[i][j−2]
if(j>=2){
dp[i][j] |= dp[i][j-2];
}
// 看 正则串不动,主串前移一个,f[i][j] = f[i-1][j]
if (i >= 1 && j >= 2 && (str[i - 1] == pattern[j - 2] || pattern[j - 2] == '.')) {
dp[i][j] |= dp[i - 1][j];
}
}
}
}
}
return dp[strN][patternN];
}
}