题解 | #牛群中的特殊编号匹配#
牛群中的特殊编号匹配
https://www.nowcoder.com/practice/62994387a2134bfc931e30d9595193e5?tpId=363&tqId=10609278&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D363
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
如果你觉得本题对你有帮助的话,可以点个赞支持一下,感谢~

查看18道真题和解析