题目链接
题目描述
请实现一个函数用来匹配包括 ’ . ’ 和 ’ * ’ 的正则表达式。模式中的字符 ‘.’ 表示任意一个字符,而 ‘*’ 表示它前面的字符可以出现任意次(包含 0 次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串 “aaa” 与模式 “a.a” 和 “abaca” 匹配,但是与 “aa.a” 和 “ab*a” 均不匹配。
解题思路
dp[i][j]表示str到i长度的子字符串和pattern到j长度的正则表达式是否匹配
public class Solution {
public boolean match(char[] str, char[] pattern){
int m = str.length, n = pattern.length;
boolean[][] dp = new boolean[m+1][n+1];
// 初始化dp
dp[0][0] = true;
for (int j=1;j<=n;j++) {
if (pattern[j-1]=='*') dp[0][j] = dp[0][j-2];
}
for (int i=1;i<=m;i++) {
for (int j=1;j<=n;j++) {
if (str[i-1]==pattern[j-1] || pattern[j-1]=='.')
dp[i][j] = dp[i-1][j-1];
else if (pattern[j-1]=='*') {
if (j>=2 && (str[i-1]==pattern[j-2]) || pattern[j-2]=='.') {
dp[i][j] |= dp[i][j-2]; // a*当做空
dp[i][j] |= dp[i][j-1]; // a*当做a
dp[i][j] |= dp[i-1][j]; // a*当做多个a,与去掉最后一个字符的str比较
} else if (j>=2) {
dp[i][j] = dp[i][j-2];
} else dp[i][j] = false;
} else dp[i][j] = false;
}
}
return dp[m][n];
}
}