dp[i][j]表示s的前i个字符串和p的前j个字符是否匹配,首先初始化,也就是假设s为空字符,若p的每个位置为‘*’,则匹配空字符。
后面的递推方程的话,前面一个代表i和j可以直接匹配,则dp[i][j]的值和d[i - 1][j - 1]的一样。
后面一个中,分别代表*匹配掉s中对应的字符和不匹配s中的那个字符,即对应了‘*’可以匹配也可以不匹配。
下面的图片的练习地址为https://alchemist-al.com/algorithms/wildcard-matching
import java.util.Scanner;
public class tongpeifu_pipei {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
String s = sc.next();
String p = sc.next();
int n=s.length();
int m=p.length();
boolean[][] dp=new boolean[n+1][m+1];//固定格式必须多一行一列
dp[0][0]=true;//初始参考值必须为true
for(int i=1;i<=m;i++){//子串的第一个为*时跟对方的空头比肯定是true
if(p.charAt(i-1)=='*'){
dp[0][i]=true;
}else{
break;//
}
}
for (int i =1; i <= n; ++i) {
for (int j =1; j <= m; ++j) {
if (p.charAt(j -1) =='*') {
//如果字符为“*”就考虑他前面跟上面的的
dp[i][j] = dp[i][j -1] || dp[i -1][j];
}else if (p.charAt(j -1) =='?' || s.charAt(i -1) == p.charAt(j -1)) {
//如果这两个字符相等或者模式串中的为通配符“?”则看前面那个字符的匹配结果就行了。
dp[i][j] = dp[i -1][j -1];
}
}
}
System.out.println(dp[n][m]);
}
}
https://alchemist-al.com/algorithms/wildcard-matching