import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
public boolean match (String s, String p) {
// write code here
s = " " + s;
p = " " + p;
boolean[][] dp = new boolean[s.length()][p.length()];
// 长度都为0时,认为匹配
dp[0][0] = true;
// str的长度为0,pattern长度不为0,有可能可以匹配上。
// pattern的长度为0,str长度不为0,有可能可以匹配上。
// 所以 dp[i][0]一定为false,不需要讨论
for (int i = 0; i < s.length(); i++) {
for (int j = 1; j < p.length(); j++) {
// pattern中下一个字符为*时不参与匹配
if (j < p.length() - 1 && p.charAt(j + 1) == '*'){
continue;
}
// 讨论当前字符是否为 *
// 是 *
if (p.charAt(j) != '*'){
dp[i][j] = (i >= 1 && j>= 1 && dp[i - 1][j - 1]) //前面的字符串匹配
&& (p.charAt(j) == '.' || s.charAt(i) == p.charAt(j)); //当前字符匹配
}
// 非 *
if (p.charAt(j) == '*'){
dp[i][j] = (j >= 2 && dp[i][j - 2]) // 匹配0个字符
|| i >= 1 && (dp[i - 1][j] && // 匹配多个字符
(p.charAt(j - 1) == s.charAt(i) //pattern前一个字符和当前字符相等
|| p.charAt(j - 1) == '.')); //pattern前一个字符为'.'
}
}
}
return dp[s.length() - 1][p.length() - 1];
}
}