正则表达式匹配
描述
请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
代码 (Java)
public class Solution {
public boolean match(char[] str, char[] pattern) {
if (str == null || pattern == null)
return false;
return matchCore(str, pattern,0, 0);
}
public boolean matchCore(char[] str, char[] p, int strIndex, int patIndex) {
// 字符串结束,模式结束
if (strIndex == str.length && patIndex == p.length)
return true;
// 字符串没结束,模式结束
if (strIndex != str.length && patIndex == p.length)
return false;
// 模式的下一个字符是'*' (其中包含了字符串结束了但是模式还没结束,也有可能true的情况)
if ((patIndex + 1) < p.length && p[patIndex + 1] == '*') {
// Java要时刻检验数组是否越界
if ((strIndex != str.length && str[strIndex] == p[patIndex]) || (p[patIndex] == '.' && strIndex != str.length)) {
// 到下一个状态(1次)
return matchCore(str, p, strIndex + 1, patIndex + 2)
// 继续当前状态(至少1次)
|| matchCore(str, p, strIndex + 1, patIndex)
// 忽略 * 匹配 (0次)
|| matchCore(str, p, strIndex, patIndex + 2);
} else {
return matchCore(str, p, strIndex, patIndex + 2); // 忽略 * 匹配 (0次)
}
}
// 模式的下一个字符不是'*'(普通字符以及'.'的情况)
if ((strIndex != str.length && str[strIndex] == p[patIndex]) ||
(p[patIndex] == '.' && strIndex != str.length))
return matchCore(str, p, strIndex + 1, patIndex + 1);
return false;
}
}