Leetcode--RegularExpressionMatching

来源:互联网 发布:传奇盛世光翼进阶数据 编辑:程序博客网 时间:2024/06/13 02:31

可以把问题简化成如下的递归形式

d[i][j]表示String s[0...i]与Pattern p[0...j]是否匹配

case1:p[j+1]!='*', 比较s[i]与p[j]。if(s[i]==p[j])d[i][j]=d[i-1][j-1] else return false。如果p[j]==‘.’,那么作相等处理

case2:p[j+1]=='*',依次调用d[i][j-1],d[i-1][j-2]...d[n][j-2]直到没有可以匹配的s[i]。如果在此期间匹配则返回true,不然调用d[n-1][j-2]

public boolean isMatch(String s, String p) {        return ismatch(s,s.length()-1,p,p.length()-1);    }    public boolean ismatch(String s,int sindex,String p,int pindex){        if(sindex>=0&&pindex<0)return false;        if(sindex<0&&pindex<0)return true;        if(sindex<0)return isNull2(p,pindex);        if(sindex>=0){            if(p.charAt(pindex)=='*')return ismatch(s,sindex,p,pindex-1);            else if(pindex==p.length()-1){                if(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.')return ismatch(s,sindex-1,p,pindex-1);                else return false;            }            if(p.charAt(pindex+1)!='*'){                if(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.')return ismatch(s,sindex-1,p,pindex-1);                else return false;            }else{                while(s.charAt(sindex)==p.charAt(pindex)||p.charAt(pindex)=='.'){                    if(ismatch(s,sindex,p,pindex-1))return true;                    sindex--;                    if(sindex<0)break;                }            }        }        if(sindex>=0)return ismatch(s,sindex,p,pindex-1);        if(sindex<0&&isNull(p, pindex))return true;        if(sindex<0&&pindex>=0)return false;        return false;    }    public boolean isNull(String p,int pindex){        if(p.charAt(pindex)=='*') pindex--;        while(p.charAt(pindex+1)=='*'){            if(pindex==0)return true;            pindex=pindex-2;        }        return false;    }    public boolean isNull2(String p,int pindex){        pindex--;        while(p.charAt(pindex+1)=='*'){            if(pindex==0)return true;            pindex=pindex-2;        }        return false;    }


0 0