题目描述:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
思路:首先判断两个字符串的合法性,str不包含'.'和'*',pattern中第一个字符不能为‘*’且任意两个‘*’不能相邻。
递归判断两个字符串每一位是否匹配。
代码:
public class Solution {
public boolean match(char[] str, char[] pattern){
if(str == null || pattern == null){
return false;
}
return isValid(str, pattern) ? process(str, pattern, 0, 0) : false;
}
public boolean isValid(char[] s, char[] e){
for(int i = 0; i < s.length; i++){
if(s[i] == '*' && s[i] == '.'){
return false;
}
}
for(int i = 0; i < e.length; i++){
if(e[i] == '*'&&(i == 0 || e[i - 1] == '*')){
return false;
}
}
return true;
}
public boolean process(char[] s, char[] e, int si, int ei){
if(ei == e.length){
return si == s.length;
}
if(ei + 1 == e.length || e[ei + 1] != '*'){
return si != s.length && (e[ei] == s[si] || e[ei] == '.')
&& process(s, e, si + 1, ei + 1);
}
while(si != s.length && (e[ei] == s[si] || e[ei] == '.')){
if(process(s, e, si, ei + 2)){
return true;
}
si++;
}
return process(s, e, si, ei + 2);
}
}