思路:递归计算,关键在于多种情况的分析。
我将模式串的3种情况‘.’,‘字母相等’,‘字母不相等’分别讨论
每种情况分为两种子情况,模式串的后一位是' * '和不是' * '。
设置两个指针i,j表示str和Pattern的下标,还有一种特殊的情况当i==str.length时也可能返回true。
我将这种情况单独讨论了。
其实最好的分情况讨论就是讨论,模式串的下一位是否为‘*’。
public boolean match(char[] str, char[] pattern) {
return help(str,pattern,0,0);
}
private boolean help(char[] str, char[] pattern, int i, int j) {
if (i == str.length && j == pattern.length) return true;
if(j>=pattern.length)return false;
if (i == str.length&&j<pattern.length) {
if((j + 1) < pattern.length && pattern[j + 1] == '*'){
return help(str,pattern,i,j+2);
}
return false;
}
if (pattern[j] == '.' && (j + 1) < pattern.length && pattern[j + 1] == '*') {
return help(str, pattern, i, j+2)||help(str,pattern,++i,j);
}else if (pattern[j] == '.'){
return help(str, pattern, ++i, ++j);
}
if (str[i] == pattern[j] && (j + 1) < pattern.length && pattern[j + 1] == '*') {
return help(str, pattern, i, j + 2) || help(str, pattern, ++i, j);
} else if (str[i] == pattern[j]) {
return help(str, pattern, ++i, ++j);
}
if (str[i] != pattern[j] && (j + 1) < pattern.length && pattern[j + 1] == '*') {
return help(str, pattern, i, j + 2);
} else {
return false;
}
}
京公网安备 11010502036488号