package 牛客网剑指offer题库;
public class 正则表达式匹配 {
public static void main(String[] args) {
// TODO Auto-generated method stub
正则表达式匹配 test=new 正则表达式匹配();
System.out.println(test.match("".toCharArray(),".".toCharArray()));
}
public boolean match(char[] str, char[] pattern){
if(str.length==0&&pattern.length==0)return true;
else return match1(str,pattern,0,0);
}
/**
* si,pi表示当前函数要匹配的字符和对应的正则字符
* 首先,如果当前字符和正则字符同时走完,则返回true
* 如果正则字符走完而匹配字符未走完,返回false
* 如果正在字符未走完,匹配字符已走完,由于'*'的存在,继续匹配,比如ab,abc*
* 匹配时分为下一个正则字符是*和不是*
* 如果下一个正则字符存在且是*,那么如果当前字符存在且匹配,则可以选择不匹配当前字符和匹配当前字符,并用当前正则字符匹配下一个字符
* 如果当前字符不存在或不匹配,则选择不匹配当前字符
* 如果下一个不是*,那么如果当前字符存在且匹配,则继续匹配,否则返回false
* @param str
* @param pattern
* @param si
* @param pi
* @return
*/
private boolean match1(char[] str, char[] pattern, int si, int pi) {
// TODO Auto-generated method stub
if(si>=str.length&&pi>=pattern.length) return true;
if(pi>=pattern.length&&si<str.length) return false;
if((pi+1)<pattern.length&&
pattern[pi+1]=='*') {
//如果当前字符匹配,尝试匹配完成或继续匹配
if(si<str.length&&
(pattern[pi]=='.'||pattern[pi]==str[si])) {
return match1(str, pattern, si, pi+2)
||match1(str,pattern,si+1,pi);
}else
return match1(str, pattern, si, pi+2);
}else {
if(si<str.length&&
(pattern[pi]=='.'||pattern[pi]==str[si]))
return match1(str, pattern,si+1,pi+1);
else
return false;
}
}
}