题目描述
请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

示例1
输入
"aaa","a*a"
返回值
true

递归的解法

public class Solution {
    public boolean match(char[] str, char[] pattern) {
        if(str==null || pattern==null) return false; //判断参数存在,否则false
        return matchone(str,0,pattern,0);
    }
    public boolean matchone(char[] str,int s,char[] pattern,int p){
        if(s==str.length && p==pattern.length) return true;//二者均为空,为true
        if(s<str.length && p==pattern.length) return false;//非空匹配空,为flase
        //pattern后边至少有两个字符,且第二个为*
        if(p+1<pattern.length && pattern[p+1]=='*'){
            //当首字母匹配,可能有匹配一次或者多次的情况
            //当首字母不匹配,但是pattern为.时,可以看作首字母匹配,也可以看作首字母不匹配。此时结果需要加上匹配0次的可能
            if(s<str.length &&(pattern[p]==str[s]||pattern[p]=='.')){
                return matchone(str,s+1,pattern,p+2) || matchone(str,s+1,pattern,p)||matchone(str,s,pattern,p+2);
            }
            //首字母不匹配,也不是.,只有一种情况就是匹配了零次。
            else{
                return matchone(str,s,pattern,p+2);
            }
        }
        //假如后边不是*,则如果匹配或者为.,则后移以为,否则不匹配
        if(s<str.length &&(pattern[p]==str[s]||pattern[p]=='.')){
            return matchone(str,s+1,pattern,p+1);
        }
        return false;
    }
}

错误程序:通过实例:83.3%
问题理解的bug之一:ab可以匹配.*========不理解
从右向左一个一个匹配,逻辑不清晰

public class Solution {
    public boolean match(char[] str, char[] pattern){
        if(str.length==0){
            if(pattern.length==0){
                return true;
            }
            else{
                if(pattern.length>1){
                    for(int i=1;i<pattern.length;i+=2){
                        if(pattern[i]!='*'){
                            return false;
                        }
                    }
                    return true;
                }
                return false;
            }
        }
        if(pattern.length==0) return false;
        int right0 = str.length-1;
        int right1 = pattern.length - 1;
        while (right0 >=0 && right1>0) {
            if (str[right0] == pattern[right1] || pattern[right1] == '.') {
                if(right0>0){
                    right1--;
                    right0--;
                }
                else{
                    break;
                }
            }
            else {
                //System.out.println(right0 + "****" + right1);
                if (pattern[right1] == '*') {
                   while ((str[right0] == pattern[right1 - 1] || pattern[right1 - 1]=='.') &&right0>0) right0--;
                    if(right1-2>=0){
                        right1 -= 2;
                    }
                    else {
                        right1--;
                        break;
                    }
                }
                else{
                    break;
                }
            }
        }
        if ((str[right0] == pattern[right1] || pattern[right1]=='.')&& right0==0&& right1==0) return true;
        return false;
    }
}