请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
使用动态规划
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length() + 1;
int n = p.length() + 1;
boolean[][] dp = new boolean[m][n];
//空字符串肯定匹配
dp[0][0] = true;
//初始化
for(int i = 2;i < n;i += 2){
//当偶数位为*时才能匹配
dp[0][i] = dp[0][i-2] && p.charAt(i-1) == '*';
}
for(int i = 1;i < m;i++){
for(int j = 1;j < n;j++){
//索引从0开始,对应字符索引要减1
if(p.charAt(j-1) == '*'){
//1、如果p最后一个字符为*,判断把p最后两个字符去了可不可以匹配
//即*前的字符出现0次
if(dp[i][j-2]){
dp[i][j] = true;
}
//2、如果p最后一个字符为*,且s的前i-1位和p的前j位相匹配,
//并且s的最后一个字符和p倒数第二个字符(*前的字符)相同,
//即*前的字符和s结尾字符有多个重合,让它多出现1次时,能否匹配;
else if(dp[i-1][j] && s.charAt(i-1) == p.charAt(j-2)){
dp[i][j] = true;
}
//3、如果p最后一个字符为*,且s的前i-1位和p的前j位相匹配,
//*前为.时,它多出现1次时,能否匹配;
else if(dp[i-1][j] && p.charAt(j-2) == '.'){
dp[i][j] = true;
}
}else{
if(dp[i-1][j-1] && s.charAt(i-1) == p.charAt(j-1)){
dp[i][j] = true;
}else if(dp[i-1][j-1] &&p.charAt(j-1) == '.'){
dp[i][j] = true;
}
}
}
}
return dp[m-1][n-1];
}
}
执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:40 MB, 在所有 Java 提交中击败了58.59%的用户
通过测试用例:448 / 448