题目描述
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求: 实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同) ?:匹配1个字符
输入:
通配符表达式;
一组字符串。
输出:
返回匹配的结果,正确输出true,错误输出false
输入描述:
先输入一个带有通配符的字符串,再输入一个需要匹配的字符串
输出描述:
返回匹配的结果,正确输出true,错误输出false
输入
te?t*.*
txt12.xls
输出
false
AC代码(dp):
1 import java.util.Objects; 2 import java.util.Scanner; 3 4 /** 5 * 1. if '*', dp[i][j] = dp[i][j-1] || dp[i-1][j] 6 * 2. else dp[i][j] = dp[i-1][j-1] && (a[i]==b[j] || a[i] == '?') 7 */ 8 public class Main { 9 10 public static Boolean matching(String regularStr, String matchingStr) { 11 int regularLen = regularStr.length(); 12 int matchingLen = matchingStr.length(); 13 Boolean dp[][] = new Boolean[regularLen + 1][matchingLen + 1]; 14 dp[0][0] = true; 15 for (int i = 0; i < regularLen; i++) { 16 dp[i + 1][0] = false; 17 } 18 for (int i = 0; i < matchingLen; i++) { 19 dp[0][i + 1] = false; 20 } 21 for (int i = 0; i < regularLen; i++) { 22 for (int j = 0; j < matchingLen; j++) { 23 if (Objects.equals(regularStr.charAt(i), '*')) { 24 dp[i + 1][j + 1] = dp[i + 1][j] || dp[i][j + 1]; 25 } else { 26 dp[i + 1][j + 1] = dp[i][j] && 27 (Objects.equals(regularStr.charAt(i), matchingStr.charAt(j)) || 28 (Objects.equals(regularStr.charAt(i), '?'))); 29 } 30 } 31 } 32 return dp[regularLen][matchingLen]; 33 } 34 35 public static void main(String[] args) { 36 Scanner scanner = new Scanner(System.in); 37 while (scanner.hasNextLine()) { 38 String regularStr = scanner.nextLine(); 39 String matchingStr = scanner.nextLine(); 40 System.out.println(matching(regularStr, matchingStr)); 41 } 42 } 43 }
dfs:
1 import java.util.Objects; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static Boolean matching(String regularStr, String matchingStr, int i, int j) { 7 if (i >= regularStr.length() && j >= matchingStr.length()) { 8 return true; 9 } 10 if (i >= regularStr.length() || j >= matchingStr.length()) { 11 return false; 12 } 13 if (Objects.equals(regularStr.charAt(i), '*')) { 14 return matching(regularStr, matchingStr, i + 1, j) || 15 matching(regularStr, matchingStr, i, j + 1) || 16 matching(regularStr, matchingStr, i + 1, j + 1); 17 } else if (Objects.equals(regularStr.charAt(i), '?')) { 18 return matching(regularStr, matchingStr, i + 1, j + 1); 19 } else if (Objects.equals(regularStr.charAt(i), matchingStr.charAt(j))) { 20 return matching(regularStr, matchingStr, i + 1, j + 1); 21 } 22 return false; 23 } 24 25 public static void main(String[] args) { 26 Scanner scanner = new Scanner(System.in); 27 while (scanner.hasNextLine()) { 28 String regularStr = scanner.nextLine(); 29 String matchingStr = scanner.nextLine(); 30 System.out.println(matching(regularStr, matchingStr, 0, 0)); 31 } 32 } 33 }
java match:
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args) { 4 Scanner sc = new Scanner(System.in); 5 while(sc.hasNext()){ 6 String zhengze = sc.next(); 7 String s = sc.next(); 8 zhengze = zhengze.replaceAll("\\?","[\\\\w]{1}"); 9 zhengze = zhengze.replaceAll("\\*","[\\\\w]*"); 10 System.out.println(s.matches(zhengze)); 11 } 12 sc.close(); 13 } 14 }