题解 | #字符串通配符#
字符串通配符
https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
h*h*ah**ha*h**h***hha
hhhhhhhahhaahhahhhhaaahhahhahaaahhahahhhahhhahaaahaah
false
以上测试用例深度优先算法和String的matches方法运行时间都会超过1秒
推荐动态规划算法
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
// while (in.hasNextInt()) { // 注意 while 处理多个 case
// int a = in.nextInt();
// int b = in.nextInt();
// System.out.println(a + b);
// }
String s1 = in.nextLine();
String s2 = in.nextLine();
while (s1.contains("**")) {
s1 = s1.replaceAll("\\*\\*", "*");
}
// System.out.print(dfs(s1.toLowerCase(), s2.toLowerCase(), 0, 0));
// System.out.print(getOc(s1.toLowerCase(), s2.toLowerCase()));
System.out.print(dp(s1.toLowerCase(), s2.toLowerCase()));
}
// h*h*ah**ha*h**h***hha
// hhhhhhhahhaahhahhhhaaahhahhahaaahhahahhhahhhahaaahaah
// false
//以上测试用例深度优先算法和String的matches方法所用时间都会超过1秒
private static boolean dfs(String s1, String s2, int p1, int p2) {
if (s1.length() == p1 && s2.length() == p2) {
return true;
} else if (s1.length() == p1 || s2.length() == p2) {
return false;
}
if (s1.charAt(p1) == '*') {
if (String.valueOf(s2.charAt(p2)).matches("[A-Za-z0-9]")) {
return dfs(s1, s2, p1 + 1, p2) || dfs(s1, s2, p1, p2 + 1) ||
dfs(s1, s2, p1 + 1, p2 + 1);
} else {
return dfs(s1, s2, p1 + 1, p2 + 1);
}
} else if (s1.charAt(p1) == '?' || s1.charAt(p1) == s2.charAt(p2)) {
return dfs(s1, s2, p1 + 1, p2 + 1);
} else {
return false;
}
}
public static boolean getOc(String in, String temp) {
//字符串通配符
in = in.replaceAll("\\?", "[0-9A-Za-z]{1}");
in = in.replaceAll("\\*", "[0-9A-Za-z]{0,}");
//in = in.replaceAll("\\.", "\\\\.");
return temp.matches(in);
}
private static boolean dp(String s1, String s2){
int len1 = s1.length();
int len2 = s2.length();
boolean[][] dp = new boolean[len1 + 1][len2 + 1];
dp[0][0] = true;
for (int i = 1; i <= len1; i++) {
char c1 = s1.charAt(i - 1);
for (int j = 1; j <= len2; j++) {
char c2 = s2.charAt(j - 1);
if (c1 == c2 || (c1 == '?' && String.valueOf(c2).matches("[A-Za-z0-9]"))) {
dp[i][j] = dp[i - 1][j - 1] || dp[i - 1][j];
} else if (c1 == '*') {
if (String.valueOf(c2).matches("[A-Za-z0-9]")) {
dp[i][j] = dp[i - 1][j - 1] || dp[i][j - 1];
}
} else {
dp[i][j] = false;
}
}
}
return dp[len1][len2];
}
}

