/*
* 请实现一个函数用来匹配包括'.'和'*'的正则表达式。
* 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
* 在本题中,匹配是指字符串的所有字符匹配整个模式。
* 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
*/
public class RegularMatch {
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[] pattern, int strIndex, int patternIndex) {
if(strIndex == str.length && patternIndex == pattern.length)
return true;
if(strIndex != str.length && patternIndex == pattern.length)
return false;
//模式串第二个字符是*
if(patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') {
//匹配
if(strIndex < str.length && str[strIndex] == pattern[patternIndex] || strIndex < str.length && pattern[patternIndex] == '.') {
return matchCore(str, pattern, strIndex + 1, patternIndex) || // 如果这种情况匹配成功,说明这个'*'前面的字符可能要重复两次以上
matchCore(str, pattern, strIndex, patternIndex + 2); // 如果这种情况匹配成功,说明这个'*'前面的字符需要被忽略
}
//不匹配,这个'*'前面的字符需要被忽略
else {
return matchCore(str, pattern, strIndex, patternIndex + 2);
}
}
//模式串第二个字符不是*,正常匹配
if(strIndex < str.length && str[strIndex] == pattern[patternIndex] || strIndex < str.length && pattern[patternIndex] == '.') {
return matchCore(str, pattern, strIndex + 1, patternIndex + 1);
}
return false;
}
public static void main(String[] args) {
char [] a = {'a','a','a'};
char [] b = {'b','*','a'};
System.out.println(new RegularMatch().match(a, b));
}
}
《剑指offer》-正则表达式匹配
最新推荐文章于 2021-02-19 00:40:17 发布