输入一个字符串 和 一个pattern. 返回结果是否匹配上
public static boolean isMatch(String str, String strPattern) { int countXing = 0; for (char c : strPattern.toCharArray()) countXing++; if (strPattern.length() - countXing > str.length()) //说明s2去掉通配符,长度也长于s1 return false; //动态规划设置初值 boolean[][] dp = new boolean[strPattern.length() + 1][str.length() + 1]; dp[0][0] = true; for (int i = 1; i <= strPattern.length(); i++) { char s2_char = strPattern.charAt(i - 1); dp[i][0] = dp[i - 1][0] && s2_char == '*'; //设置每次循环的初值,即当星号不出现在首位时,匹配字符串的初值都为false for (int j = 1; j <= str.length(); j++) { char s1_char = str.charAt(j - 1); if (s2_char == '*') dp[i][j] = dp[i - 1][j] || dp[i][j - 1]; //动态规划递推式(星号) 表示星号可以匹配0个(决定于上次外循环的结果)或者多个(决定于刚才内循环的结果) else dp[i][j] = dp[i - 1][j - 1] && (s2_char == '?' || s1_char == s2_char); //动态规划递推式(非星号) 表示dp值取决于上次的状态和当前状态 } } return dp[strPattern.length()][str.length()]; }