题目描述
请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
思路:
- 首先要理解正则表达式两个字符.和*,.是可以匹配任意一个字符,而*则是前一个字符可以出现0-n次
- 情况有很多种,我们这里考虑模式串也就是pattern,①空②.③④.⑤a和aa*是一样的,与字符串比较
- 考虑很多种情况,建议带入代码详细阅读
public class Solution {
public boolean match(char[] str, char[] pattern)
{
return matchTwo(str,0,str.length,pattern,0,pattern.length);
}
private boolean matchTwo(char[] str, int i, int length1, char[] pattern,
int j, int length2) {
if(i==length1&&j==length2) { //因为传进来是0,如果相等就直接返回true
return true;
}
//a*a*
//如果字符串为0,但是模式串不为0
if(i==length1&&j!=length2) {
while(j!=length2){
//第一个不是*,如果模式串长度为1那肯定不等,或者第一个不是*,第二个也不是*也不等
if(pattern[j]!='*'&&(j+1>=length2||pattern[j+1]!='*')){ //偶数位是否为*
return false; //a*a*
}
//如果第二个是*了,接下来继续判断后面,第二个*为第一个直接j++;j=2
j++;
}
return true;
}
//2. 如果模式串为空,字符串不为空直接false
if(i!=length1&&j==length2) {
return false;
}
//如果模式长度为1,如果模式串和字符串相等或者模式串那一个是.就比较下一个,长度都相等的话递归会返回true
if(j+1==length2){
if(str[i]==pattern[j]||pattern[j]=='.')
return matchTwo(str, i+1, length1, pattern, j+1, length2);
else {
return false;
}
}
if((str[i]==pattern[j]||pattern[j]=='.')&&pattern[j+1]!='*') //如果下一个不是*,递归直接比较每个字符,只用注意.
return matchTwo(str, i+1, length1, pattern, j+1, length2);
if((str[i]==pattern[j]||pattern[j]=='.')&&pattern[j+1]=='*')
//如果下一个是*,那模式串为.和*,当*为出现0次直接开始比较模式串的后面2位
//另一种情况继续比较字符串第二个因为模式串有*可以出现多个.
return matchTwo(str, i, length1, pattern, j+2, length2)||matchTwo(str, i+1, length1, pattern, j, length2);
if(pattern[j+1]=='*')//如果第一个不相等也不为.但是第二个为*,仍然可以匹配,因为*可以出现0次
return matchTwo(str, i, length1, pattern, j+2, length2);
return false;
}
}