编程语言:Java
题目链接:https://leetcode-cn.com/problems/regular-expression-matching/
题解:看注释,太菜了,搬题解。
结果:
class Solution {
public boolean isMatch(String s, String p) {
if (s != null && p != null) {
int m = s.length();
int n = p.length();
boolean[][] dp = new boolean[m + 1][n + 1];
//两边都是空字符串,自然匹配成功
dp[0][0] = true;
for (int i = 0; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (p.charAt(j - 1) == '*') {
//当p字符串j-1位置是*时,他自然而然的可以匹配前一个字符一个字符也不匹配的情况
dp[i][j] = dp[i][j - 2];
if (matches(s, p, i, j-1))
//如果s字符串i位置能跟p字符串*前的字符匹配,那么就可以加上这种情况
dp[i][j] |= dp[i - 1][j];
}else{
//当p字符串j-1位置不是*就直接匹配完事了
if(matches(s, p, i, j))
dp[i][j]=dp[i-1][j-1];
}
}
}
return dp[m][n];
} else {
return false;
}
}
private boolean matches(String s, String p, int i, int j) {
if (i == 0)
return false;
if (p.charAt(j - 1) == '.')
return true;
return s.charAt(i - 1) == p.charAt(j - 1);
}
}