题目描述:
请实现一个函数用来匹配包括 ’ . ’ 和 ’ * '的 正则表达式。
模式中的字符 ’ . ’ 表示任意一个字符,而 ’ * ’ 表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。
题解:
设置指针 i ,指针 j 分别指向 str数组 和 pattern数组。
- 当前 i,j 所指向的元素相等,两指针全都向后移。
- 当前 j 指向的元素为 ’ . ',两指针全都向后移。
- 如果 j + 1 指向的是 ‘ * ’
(1)当前 i,j 指向不同,那就把 ‘ * ’ 前面的字符理解出现了0次,i不动,j+2。
(2)当前 i,j 指向相同,则会有以下三种情况
—(a)理解为 ‘ * ’ 前面的字符出现了0次,则 i不动,j+2
—(b)理解为 ‘ * ’ 前面的字符出现了一次,则 i+1,j+2
—(c)理解为 ‘ * ’ 前面的字符出现了多次,则 i+1,j不动
public static boolean match(char[] str, char[] pattern){
if(str.length == 0 && pattern.length == 0){
return true;
}
if(pattern.length == 0){
return false;
}
return matchExpression(str,0,pattern,0);
}
public static boolean matchExpression(char[] str,int i,char[] pat,int j){
if (i == str.length && j == pat.length) { // 字符串和模式串都为空
return true;
} else if (j == pat.length) { // 模式串为空
return false;
}
if (j + 1 < pat.length && pat[j + 1] == '*') {
//出现了*,并且i和j指向的相同,3种情况并列
if ((i < str.length && pat[j] == '.')
|| (i < str.length && pat[j] == str[i])) {
return matchExpression (str, i, pat, j + 2)
|| matchExpression (str, i + 1, pat, j)
|| matchExpression (str, i + 1, pat, j + 2);
} else {
//出现了*,并且i和j指向的不同,那就把*前面的字符理解出现了0次,p+2
return matchExpression (str, i, pat, j + 2);
}
}
if(i < str.length && (str[i] == pat[j] || pat[j] == '.')){
return matchExpression (str,i+1,pat,j+1);
}
return false;
}