官方题解的java版本,加了点细节。
题目里比较容易引起歧义的应该是匹配的定义吧,需要的是完全覆盖,就是s变换以后不能比m长也不能比m短,就是刚好覆盖才算匹配。
import java.util.Scanner;
public class Main {
static String s1,s2;
public static boolean dfs(int i,int j,int cur){
if(j==s2.length() && i==s1.length()) //两个值都记录到两个串的末尾加1还没有找到不匹配的,则返回匹配
return true;
if(i==s1.length()) //表达串到底但数字串没到
return false;
if(j<s2.length() && s1.charAt(i)==s2.charAt(j)){ //j<s2.length()是比c++版多的地方,不加会越界报错
return dfs(i+1,j+1,(s2.charAt(j)-'0'+cur)%10); //值相等就同时匹配下一个
}else if (j<s2.length() && s1.charAt(i)=='*'){ //找到*
return cur==s2.charAt(j)-'0'?dfs(i+1,j+1,cur%10)||dfs(i,j+1,cur%10):false; //余数等于数字串的当前值时判断下一个,否则直接返回不匹配
}
return false;
}
public static boolean re(){
if(s1.length()>s2.length()) return false; //当表达式比数字串更长时,显然做不到完全覆盖
for(int i=0;i<s2.length();i++){
if(s2.charAt(i)<'0' || s2.charAt(i)>'9') return false; //数字串里不能有数字以外的东西
}
int i=0;
for(;i<s1.length();i++){ //*在最前面的情况,记录有i个*
if(s1.charAt(i)!='*')
break;
}
s1=s1.substring(i); //i个*在最前面相当于两个字符串前i个值都可以删掉
s2=s2.substring(i);
if((s1=="" && s2!="")||(s2=="" && s1!="")) return false; //删完以后如果只有一个是空串就返回不匹配
return dfs(0,0,0);
}
public static void main(String[] args) { //初始化的过程
Scanner in = new Scanner(System.in);
int n=in.nextInt();
if (n==0) System.exit(0);
in.nextLine();
while (in.hasNextLine()) {
s1=in.nextLine();
if (s1.equals("0")) System.exit(0);
s2=in.nextLine();
n--;
if(n>=0){
boolean flag=re();
if (flag){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
}
in.close();
}
}


京公网安备 11010502036488号