052正则表达式匹配
题目:
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*
'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"aba"均不匹配
方法:递归法
思路:
1.如果字符串的第一个跟模式的第一个相同,模式第二个为时,分为3种情况
(1)"*"
表示之前出现了0次,就是x作废,从之后开始算,模式后移两位
(2)表示出现了一次,于是字符串后移一位,模式后移两位继续
(3)表示出现了很多次,字符串后移一位继续比较
2.如果字符串第一个跟模式第一个不同,模式第二个为*时,模式后移两位继续比较
ps:写递归函数,注意递归的终止条件
(1)字符串和模式都到末尾,返回true;
(2)模式到末尾,字符串没到末尾,返回false;
代码:
public boolean match(char[] str, char[] pattern) {
if(str==null||pattern==null) return false;
return isPiPei(str,pattern,0,0);
}
public boolean isPiPei(char[] str,char[] pattern,int i,int j){
if(i==str.length&&j==pattern.length) return true;
if(i!=str.length&&j==pattern.length) return false;
//如果模式第二个字符时“*”时,且字符串第一个跟模式相同,分三种情况,如果不同,则模式后移两位,
if(j+1<pattern.length&&pattern[j+1]=='*'){
if((i!=str.length&&str[i]==pattern[j])
||(pattern[j]=='.'&&i!=str.length)){
return isPiPei(str,pattern,i,j+2)//表示前面的出现了0次
||isPiPei(str,pattern,i+1,j+2)//表示前面的出现了1次,从后面继续
||isPiPei(str,pattern,i+1,j);//表示从后面的出现了n次,继续匹配下一位
}else{
return isPiPei(str,pattern,i,j+2);//第一个不相同,模式后移两位;
}
}
//如果模式第二个字符不是“*”时
if((i!=str.length&&str[i]==pattern[j])
||(pattern[j]=='.'&&i!=str.length)){
return isPiPei(str,pattern,i+1,j+1);
}
return false;
}