题目
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
解题思路
递归实现
每次分别在str 和pattern中取一个字符进行匹配,如果匹配,则匹配下一个字符,否则,返回不匹配。
当模式串中当前位是‘.’时,可以直接字串和模式串均向后移动一位;
当模式串中后一位是‘*’时,需要分以下两种情况讨论:
1、字串中当前位和模式串中当前位不相等,则直接模式串后移两位。如:ba,a*ba
2、字串中当前位和模式串中当前位相等,则又分两种种情况:
1.字串后一位与当前位相等,则字串后移一位。如:aaa,a*
2.字串后一位与当前为不等,则字串后移一位,模式串后移两位。如:ab,a*b
代码如下
public class test {
public static void main(String[] args) {
System.out.print(match("a","aa"));
}
public static boolean match(String str,String pattern) {
if(str.isEmpty()||pattern.isEmpty()) {
return false;
}
return compare(str,0,pattern,0);
}
public static boolean compare(String str,int i,String pattern ,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.charAt(j+1)=='*') {
if(str.charAt(i)==pattern.charAt(j)||pattern.charAt(j)=='.') {
return compare(str,i+1,pattern,j)
||compare(str,i+1,pattern,j+2);
}else {
return compare(str,i,pattern,j+2);
}
}
if(str.charAt(i)==pattern.charAt(j)||pattern.charAt(j)=='.') {
return compare(str,i+1,pattern,j+1);
}
return false;
}
}