题目描述
请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配。
public class Solution {
public boolean match(char[] str, char[] pattern) {
/*
* 如果匹配串或模式串有一方为空,则返回false。
*/
if (str == null || pattern == null) {
return false;
}
/*
* s_len,p_len 匹配串、模式串长度
*/
int s_len = str.length;
int p_len = pattern.length;
return matchPattern(str, 0, pattern, 0, s_len, p_len);
}
public boolean matchPattern(char[] str, int i, char[] pattern, int j,
int s_len, int p_len) {
/*
* 匹配串和模式串都到达末尾,匹配成功。
*/
if (i >= s_len && j >= p_len) {
return true;
}
/*
* 模式串已匹配到末尾,而匹配串未匹配完,匹配失败。
*/
if (i != s_len && j == p_len) {
return false;
}
/*
* 模式串当前字符的下一个字符为'*'的情形。
*/
if (j < p_len - 1 && pattern[j + 1] == '*') {
/*
* 匹配串已到达末尾,而模式串仍为到达,且模式串未匹配完部分形如a*b*c*之类。
*/
if (i >= s_len) {
return matchPattern(str, i, pattern, j + 2, s_len, p_len);
}
/*
* 匹配串i位和模式串j位匹配。
*/
if (str[i] == pattern[j] || pattern[j] == '.') {
/*
* 匹配串向后移动一个位置,模式串不移动 ,匹配次数大于1次。
* 例如: abbbbbc ab*c
*/
return matchPattern(str, i + 1, pattern, j, s_len, p_len)
/*
* 匹配串向后移动一个位置,模式串向后移动两个位置 ,即只匹配了一次。
* 例如:abcd ab*cd
*/
|| matchPattern(str, i + 1, pattern, j + 2, s_len,
p_len)
/*
* 匹配串不移动,模式串向后移动两个位置 ,匹配此时0次。
* 例如: abcd ab*bcd
*/
|| matchPattern(str, i, pattern, j + 2, s_len, p_len);
}else {
/*
* 匹配串i位和模式串j位不匹配。
*/
return matchPattern(str, i, pattern, j+2, s_len, p_len);
}
}
/*
* 匹配串已匹配完,但模式串仍未匹配完,且模式串未匹配部分形如cdef
* 例如: ab abcdef
*/
if(i>=s_len){
return false;
}
/*
* 匹配串i位和模式串j位匹配。
* 匹配串和模式串各移动一位
*/
if(str[i] == pattern[j]||pattern[j] == '.'){
return matchPattern(str, i+1, pattern, j+1, s_len, p_len);
}
return false;
}
}