动态规划
package com.patience.interview.huawei;
import java.util.Scanner;
/**
* 通配符匹配算法
* @author Green.Gee
* @date 2022/11/23 10:55
* @email green.gee.lu@gmail.com
*/
public class UniversalFit {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String line1 = in.nextLine().toLowerCase();// * 匹配 0 - 多个字符,? 匹配一个字符 匹配是不区分大小写
String line2 = in.nextLine().toLowerCase();// 匹配字符 0-9 英文字符
char [] s1 = line1.toCharArray();
char [] s2 = line2.toCharArray();
boolean[][] dp = new boolean[s1.length + 1][s2.length + 1];
dp[0][0] = true;
for(int i = 1;i<= s1.length;i++) {
if(s1[i - 1] == '*'){
dp[i][0] = true;
}else
break;
}
for(int i = 1; i <= s1.length; i++){
for(int j = 1; j <= s2.length; j++) {
char a = s1[i - 1];
char b = s2[j - 1];
if(a == b){
dp[i][j] = dp[i - 1][j - 1];
}
boolean condition = (b>='a'&&b<='z')||(b>='0'&&b<='9');
if(a == '*' && condition){
dp[i][j] = dp[i - 1][j] ||
dp[i][j - 1]||
dp[i - 1][j - 1];
}else if(a == '?' && condition){
dp[i][j] = dp[i - 1][j - 1];
}
}
}
System.out.println(dp[s1.length][s2.length]);
}
}
}
递归方法(未试验通过)
private static boolean helper(String s1, String s2, int p1, int p2){
//base case
if (p1 == s1.length() && p2 == s2.length()){
return true;
}else if (p1 == s1.length()){
return false;
}else if(p2 == s2.length()){
return false;
}
//遇到'?'跟两个一样操作一样,直接指针都往后移一个继续比较
if(s1.charAt(p1) == s2.charAt(p2)){
return helper(s1, s2, p1+1, p2+1);
}
if (s1.charAt(p1) == '?'){
boolean flag = ((s2.charAt(p2)>='a'&&s2.charAt(p2)<='z')||(s2.charAt(p2)>='0'&&s2.charAt(p2)<='9'));
if(flag){
return helper(s1, s2, p1+1, p2+1);
}
return false;
//遇到'*'两种情况,要不就各跳过一个比较后面,要不就s2继续往后跳先不比较
}else if (s1.charAt(p1) == '*'){
if(p1 == s1.length() - 1){
p1 = s1.length();
p2 = s2.length();
return helper(s1,s2,p1,p2);
}
boolean flag = ((s2.charAt(p2)>='a'&&s2.charAt(p2)<='z')||(s2.charAt(p2)>='0'&&s2.charAt(p2)<='9'));
if(flag){
return helper(s1, s2, p1, p2 +1) ||
helper(s1, s2, p1+1, p2+1) ||
helper(s1, s2, p1 +1, p2) ||
helper(s1, s2, p1 - 1, p2);
}
return false;
}else {
return true;
}
}