您的位置:首页 > Web前端

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

2017-06-08 22:18 288 查看


题目描述

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含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);

        }

        

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: