import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
String p = in.nextLine();
System.out.println(isMatch(s, p) ? "true" : "false");
}
private static boolean isMatch(String s, String p) {
int m = s.length();
int n = p.length();
boolean[][] dp = new boolean[m + 1][n + 1];
dp[0][0] = true;
for (int i = 1; i <= m; i++) {
if (s.charAt(i - 1) == '*' && dp[i - 1][0]) {
dp[i][0] = true;
} else {
dp[i][0] = false;
}
}
for (int i = 1; i <= m; i++) {
char sc = s.charAt(i - 1);
for (int j = 1; j <= n; j++) {
char pc = p.charAt(j - 1);
if (sc == '*') {
boolean case0 = dp[i - 1][j];
boolean caseMore = isAlphanumeric(pc) && dp[i][j - 1];
dp[i][j] = case0 || caseMore;
} else if (sc == '?') {
dp[i][j] = isAlphanumeric(pc) && dp[i - 1][j - 1];
} else {
dp[i][j] = charMatch(sc, pc) && dp[i - 1][j - 1];
}
}
}
return dp[m][n];
}
private static boolean isAlphanumeric(char c) {
return Character.isLetterOrDigit(c);
}
private static boolean charMatch(char a, char b) {
if (Character.isLetter(a)) {
return Character.toLowerCase(a) == Character.toLowerCase(b);
} else {
return a == b;
}
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 初始化动态规划数组:dp[0][0] 初始化为 true,表示空字符串匹配空模式。
- 处理边界条件:当目标字符串为空时,只有通配符字符串全为 '*' 时才可能匹配。
- 状态转移:'*' 处理:可以匹配零个或多个字符。匹配零个字符时继承前一个状态;匹配多个字符时检查当前字符是否为字母或数字。'?' 处理:检查当前字符是否为字母或数字,并继承前一个状态。普通字符处理:检查字符是否匹配(考虑大小写)。



京公网安备 11010502036488号