请实现一个函数用来匹配包含'. '
和'*'
的正则表达式。模式中的字符'.'
表示任意一个字符,而'*'
表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"
与模式"a.a"
和"ab*ac*a"
匹配,但与"aa.a"
和"ab*a"
均不匹配。
示例 1:
输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。
class Solution {
public boolean isMatch(String s, String p) {
char[] s1 = s.toCharArray();
char[] p1 = p.toCharArray();
int m = s1.length;
int n = p1.length;
boolean[][] dp = new boolean[m+1][n+1];
dp[0][0] = true;
//p可以匹配空s
for(int j = 1; j <= n; j++){
if(p1[j-1] == '*' && dp[0][j-2] == true){
dp[0][j] = true;
}
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(s1[i-1] == p1[j-1] || p1[j-1] == '.'){
dp[i][j] = dp[i-1][j-1];
}
if(p1[j-1] == '*'){
if(s1[i-1] == p1[j-2] || p1[j-2] == '.'){
dp[i][j] = (dp[i-1][j]||dp[i][j-2]||dp[i][j-1]);
}else if(s1[i-1] != p1[j-2] && p1[j-2] != '.'){
dp[i][j] = dp[i][j-2];
}
}
}
}
return dp[m][n];
}
}