import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param p string字符串
* @return bool布尔型
*/
public boolean is_match(String s, String p) {
int m = s.length();
int n = p.length();
boolean[][] dp = new boolean[m + 1][n + 1];
dp[0][0] = true;
// 初始化dp[0][j]
for (int j = 1; j <= n; j++) {
if (p.charAt(j - 1) == '*') {
dp[0][j] = dp[0][j - 2];
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
// 如果p字符串此时是.号或者 从两个字符串中取出的字符是相等的,那么就只要各自保存前一个值的状态,如果前面为true,则为true
if (p.charAt(j - 1) == '.' || p.charAt(j - 1) == s.charAt(i - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else if (p.charAt(j - 1) == '*') {
// 将 * 视作 0次的情况,相当于忽略前一个字符
dp[i][j] = dp[i][j - 2];
// 如果j-1=* j-2=.那么只要dp[i-1][j]为真,那么就是真
// 或者 j-1=* 并且 s的第i-1个字符和p的j-2个字符相等 那么同理,dp[i-1][j]为真就能匹配
if (p.charAt(j - 2) == '.' || p.charAt(j - 2) == s.charAt(i - 1)) {
dp[i][j] |= dp[i - 1][j];
}
}
}
}
return dp[m][n];
}
}
本题知识点分析:
1.动态规划
2.数学模拟
3.数组遍历
本题解题思路分析:
1.利用dp数组创建boolean 二维数组 行列分别代表s数组和n数组
2.初始化dp[0][j],因为如果p数组存在*的情况,那么其实可以进行初始化,*可以代表出现0次,那么0的时候的状态可以被传递给2,4,.....之类的2的倍数
3.然后根据数学模拟进行分类
4.如果p字符串此时是.号或者 从两个字符串中取出的字符是相等的,那么就只要各自保存前一个值的状态,如果前面为true,则为true
5.如果出现*号, 将 * 视作 0次的情况,相当于忽略前一个字符
6.如果j-1=* j-2=.那么只要dp[i-1][j]为真,那么就是真 或者 j-1=* 并且 s的第i-1个字符和p的j-2个字符相等 那么同理,dp[i-1][j]为真就能匹配
本题使用编程语言: Java
如果你觉得本题对你有帮助的话,可以点个赞支持一下,感谢~

京公网安备 11010502036488号