题目描述: 请实现一个函数用来匹配包括 ’ . ’ 和 ’ * '的 正则表达式。 模式中的字符 ’ . ’ 表示任意一个字符,而 ’ * ’ 表示它前面的字符可以出现任意次(包含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; }