请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
思路:
利用递归的思想:
// 当第二个字符为 '*' 时, // 若str[index1] == pattern[index2],那么则可以分为三种情况,如下: // 1.调用 myMatch(str, pattern, index1 + 1, index2),说明匹配到了多个字符 // 2.调用 myMatch(str, pattern, index1 + 1, index2 + 2),说明匹配到了一个字符 // 3.调用 myMatch(str, pattern, index1, index2 + 2),可以防止下面的这种情况的发生 // 例如:在pattern中存在 ab*baa 去匹配 str中 abaa的情况 // 若str[index1] != pattern[index2],那么直接递归 myMatch(str, pattern, index1, index2 + 2);即可 // 当第二个字符不为 '*'时, // 当 str[index1] == pattern[index2]的情况下 , 直接调用 myMatch(str, pattern, index1 + 1, index2 + 1);即可 // 否则,返回false
public class Solution {
public static boolean match(char[] str, char[] pattern){
// 控制待匹配数组的索引
int index1 = 0;
// 控制正则表达式的索引
int index2 = 0;
return myMatch(str, pattern, index1, index2);
}
public static boolean myMatch(char[] str, char[] pattern, int index1, int index2) {
if (index1 >= str.length && index2 == pattern.length) {
return true;
}
if (index1 < str.length && index2 >= pattern.length) {
return false;
}
// 当第二个字符为 '*' 时,
// 若str[index1] == pattern[index2],那么则可以分为三种情况,如下:
// 1.调用 myMatch(str, pattern, index1 + 1, index2),说明匹配到了多个字符
// 2.调用 myMatch(str, pattern, index1 + 1, index2 + 2),说明匹配到了一个字符
// 3.调用 myMatch(str, pattern, index1, index2 + 2),可以防止下面的这种情况的发生
// 例如:在pattern中存在 ab*baa 去匹配 str中 abaa的情况
// 若str[index1] != pattern[index2],那么直接递归 myMatch(str, pattern, index1, index2 + 2);即可
if (index2 + 1 < pattern.length && pattern[index2 + 1] == '*') {
if (index1 < str.length && (str[index1] == pattern[index2] || pattern[index2] == '.')) {
return myMatch(str, pattern, index1 + 1, index2)
|| myMatch(str, pattern, index1 + 1, index2 + 2)
|| myMatch(str, pattern, index1, index2 + 2);
} else {
return myMatch(str, pattern, index1, index2 + 2);
}
}
// 当第二个字符不为 '*' 时,
if (index1 < str.length && (str[index1] == pattern[index2] || pattern[index2] == '.')) {
return myMatch(str, pattern, index1 + 1, index2 + 1);
}
return false;
}
}