import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 String s = in.next(); String p = in.next(); s = s.toLowerCase(); p = p.toLowerCase(); StringBuffer sb = new StringBuffer(); for(int i = 0;i < s.length();i++){ if(s.charAt(i) == '*' ){ if(i == s.length() - 1)sb.append(s.charAt(i)); else if(s.charAt(i+1) == '*')continue; else sb.append(s.charAt(i)); } else sb.append(s.charAt(i)); } System.out.print(match(sb.toString(),p)); } public static boolean match(String s,String p){ //同时结束返回true,有一个先结束返回false if(p.length() == 0){ //考虑末尾有* if(s.length() == 0) return true; else if(s.charAt(0) == '*') return match(s.substring(1),p); else return false; } if(s.length() == 0 && p.length() != 0)return false; char c = s.charAt(0); switch(c){ case '?':{ return match(s.substring(1),p.substring(1)); } case '*':{ char p0 = p.charAt(0); if((p0 >= '0'&& p0 <= '9')||(p0 >='a' && p0 <= 'z')){ //*无法匹配特殊字符 return match(s.substring(1),p) || match(s.substring(1),p.substring(1))|| match(s,p.substring(1)); } else return false; } default:{ if(c != p.charAt(0))return false; else return match(s.substring(1),p.substring(1)); } } } }
递归的JAVA实现,额外增加大小写转换,末尾存在*的case
将多个连续*合并降低时间复杂度