剑指offer-----正则表达式匹配

1、题目描述

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

2、思路

当模式串中第二个字符是‘*’时,分三种情况:

    (1)模式串向后移动两个字符,这相当于‘*’和它前面的字符被忽略了。

     (2)如果模式串中的第一个字符和字符串中的第一个字符相匹配,则在字符串上向后移动一个字符,而在模式串上有两种选择:可以保持模式串不变,也可以在模式串上向后移动两个字符。

当模式串中第二个字符不适‘*’时:

        如果字符串的第一个字符和模式串的第一个字符相匹配,那么在字符串和模式串上都向后移动一个字符,然后匹配剩余的字符串和模式。

3、代码

 public boolean match(char[] str, char[] pattern)
    {
        if(str==null || pattern==null){
            return false;
        }


        
        return matchCore(str,pattern,0,0);
        
    }
    public boolean matchCore(char[] str,char []pattern,int s,int p){
        if(s==str.length && p==pattern.length){
            return true;
        }
        if(s!=str.length && p==pattern.length){
            return false;
        }
        
       
        if(p<pattern.length-1 && pattern[p+1]=='*' ){
            
            if((s<str.length&&pattern[p]==str[s]) || (pattern[p]=='.'&& s<str.length)){//解决字符串length为‘0’的情况,必须将s<str.length写在这里
                return matchCore(str,pattern,s+1,p+2)||matchCore(str,pattern,s+1,p)
                       || matchCore(str,pattern,s,p+2);
                      
            }else{
                return matchCore(str,pattern,s,p+2);
            }
        }
        if(s<str.length && p<pattern.length){
            if(pattern[p]==str[s] || pattern[p]=='.'){
                return matchCore(str,pattern,s+1,p+1);
            
            }
            
        }
        
        return false;
       
    }

    

猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/80914231