【剑指offer-解题系列(53)】正则表达式匹配

来源:互联网 发布:知乎评价奚梦瑶 编辑:程序博客网 时间:2024/05/22 04:24

题目描述

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

分析

基本的函数使用递归,在函数调用过程中,总共可分为以下几种情形:
假设目标字符串 是 str ,匹配字符串是 pattern
1、如果pattern第二个字符不是 ‘*’,那么只要对比下第一个字符,然后递归比对后续字符,即str+1 和 pattern+1
2、如果第二个字符是'*',那么
  (1)如果pattern和str第一个字符相同,以下两种情况满足一种即可
   一、 递归比对pattern+2后续字符,即str 和 pattern+2                          
    二、 递归比对str+1后续字符,即str+1 和 pattern         

(2)如果pattern和str第一个字符不相同,也就是使用*作为取消字符用,
                递归比对pattern后续字符,即str 和 pattern+2

另外需要特殊处理字符长度只有1的情形

代码实现

    bool match(char* str, char* pattern )
    {   
        if( strlen(str)<=0 && strlen(pattern)<=0)
            return true;
        if( strlen(str)<=0){
            if(strlen(pattern)<=1)
                return false;
            else{
                if(pattern[1]=='*') 
                    return match(str,pattern+2 );
                else
                    return false;
            }
        } 
      
  
        if( strlen(pattern)==1 ){
            return ( strlen(str)==1 ) && (pattern[0]==str[0]||  pattern[0]=='.' ) ;
        }
            
        if(pattern[1]=='*'){
            if( pattern[0]==str[0]  || pattern[0]=='.'  ){
                
                bool res =  match(str+1,pattern) || match(str,pattern+2 );
                
                int k = 1;
                while(  k<=strlen(str)  &&  str[k-1]==str[k]  ){
                    res = res|| match(str+k,pattern+2 );
                    if(res)
                        return true;
                    k++;
                } 
                return res;
            } 
            else
                return match(str,pattern+2 );
        }
        else{ 
            return (pattern[0]==str[0] || pattern[0]=='.' )&& match(str+1,pattern+1);
        }
        
    }
原创粉丝点击