题解 | #字符串通配符#
字符串通配符
https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); char[] reg = in.next().toCharArray(); char[] target = in.next().toCharArray(); // 全部转换为小写 for (int i = 0; i < reg.length; i++) { reg[i] = Character.toLowerCase(reg[i]); } for (int i = 0; i < target.length; i++) { target[i] = Character.toLowerCase(target[i]); } // 使用dp矩阵思想 boolean[][] mutx = new boolean[target.length + 1][reg.length + 1]; mutx[0][0] = true; // 当第一个为*时,且目标值第一个不为其他字符时,全部标记为true if (reg[0] == '*' && check(target[0])) { for (int i = 1; i <= reg.length; i++) { mutx[0][i] = true; } } for (int i = 1; i <= reg.length; i++) { char ch = reg[i - 1]; // 当匹配为*时 if (ch == '*') { for (int j = 1; j <= target.length; j++) { if ((mutx[j - 1][i - 1] || mutx[j - 1][i] || mutx[j][i - 1]) && check(target[j - 1])) { mutx[j][i] = true; } } } else { for (int j = 1; j <= target.length; j++) { // 匹配或者要求 目标为只含有字母或者数字 if ((ch == target[j - 1] || (ch == '?' && check(target[j - 1]))) && mutx[j - 1][i - 1]) { mutx[j][i] = true; } } } } System.out.println(mutx[target.length][reg.length]); } public static boolean check(char ch) { // 判断是否为字母或者数字 if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ) { return true; } return false; } }