分析
递归:
public boolean matches(String str,String pattern) {
//如果匹配规则为空,那么只有当字符串为空时才匹配
if(pattern.length() <= 0) {
return str.length() <= 0;
}
//匹配第一个字符
boolean match = (str.length() > 0 && pattern.length() > 0 && (str.charAt(0) == pattern.charAt(0) || pattern.charAt(0) == '.'));
//如果匹配规则的第二个字符为*,那么返回值为字符串与*后面的匹配串是否匹配,或者是从1截取字符串与该匹配串是否匹配
if(pattern.length() > 1 && pattern.charAt(1) == '*'){
return matches(str,pattern.substring(2)) || match && matches(str.substring(1),pattern);
} else {//如果匹配规则的第二个字符不为*,并且第一个字符匹配,那么字符串和匹配串均右移一位进行匹配
return match && matches(str.substring(1),pattern.substring(1));
}
}
动态规划:
public boolean match (String str, String pattern) {
int strLen = str.length();
int patternLen = pattern.length();
//dp[i][j]表示前i个字符串与前j个匹配串的匹配情况
boolean[][] dp = new boolean[strLen+1][patternLen+1];
//初始化,空串和空匹配规则匹配
dp[0][0] = true;
//当字符串为空时,只有[字符*]这种格式可以匹配
for(int i = 2; i <= patternLen; i++) {
dp[0][i] = dp[0][i-2] && pattern.charAt(i-1) == '*';
}
for(int i = 1;i <= strLen; i++) {
for(int j = 1; j <= patternLen; j++) {
//匹配串的最后一位是否为*,如果为*,如果此时*不参与匹配,那么匹配结果就是dp[i][j-2],如果*参与匹配,那么匹配结果就是前i-1个字符串是否与前j个匹配串匹配,并且第i个字符与匹配串的第j-2个字符匹配;如果不为*,此时如果字符串前i-1与匹配串前j-1匹配,并且第i-1个字符与第j-1个字符匹配,返回结果为true
dp[i][j] = pattern.charAt(j-1) == '*' ? dp[i][j-2] || dp[i-1][j] &&
(str.charAt(i-1) == pattern.charAt(j-2) || pattern.charAt(j-2) == '.'):
dp[i-1][j-1] &&(str.charAt(i-1) == pattern.charAt(j-1) || pattern.charAt(j-1) == '.');
}
}
return dp[strLen][patternLen];
}