美文网首页
36. 正则表达式匹配

36. 正则表达式匹配

作者: HamletSunS | 来源:发表于2019-08-07 16:18 被阅读0次

    题目:
    实现包含.的正则表达式匹配
    思路:
    分3种情况,1正常字符;2是.;3是

    难点:
    1、如何判断当前字符是否匹配?可能出现哪些情况?
    当前字符如果匹配,那么要考虑带‘.’和不带‘.’两种情况,判断如下

    if(*str==*pattern || *str!='\0' && *pattern=='.')
    

    返回true说明当前字符匹配,返回false说明当前字符不匹配
    2.、 出现*如何处理?

    • 在判断当前字符匹配的时候,先判断pattern下一个字符是不是,如果是 ,用进入的处理逻辑;不是,则是一种简单的情况,只判断当前的字符是否匹配就可以了
    • 重点说一说*的处理逻辑,*出现,说明前面的字符可以匹配0次,1次,多次,于是要讨论这三种情况如何用代码表示,匹配0次,则str不变,pattern+2;匹配一次,则str+1,pattern+2;匹配多次,则str+1,pattern不变。以上是当前字符匹配的情况。若当前字符不匹配,那肯定是pattern匹配0次。
      3、 最后整个字符串匹配成功的话应该怎么判断?
    • 两个都到了结尾,说明匹配完成,返回true
    • pattern到了结尾,str没到结尾,说明匹配失败,返回false(易考虑不到)
    • 对应的,是不是str到了结尾,pattern没到结尾也代表匹配失败呢?答案是不是,因为pattern可能出现带的情况,这样也是有可能匹配成功的,若没出现带的情况,处理逻辑中会拿str==‘\0’去与pattern作比较,会返回false,因此str到结尾,pattern还没到结尾并不能作为字符串匹配结束的判断依据

    代码:

    class Solution {
    public:
        bool match(char* str, char* pattern)
        {
           if(str==nullptr||pattern==nullptr)//判断方法情况
               return false;
            if(*str=='\0' && *pattern=='\0')//判断匹配成功的情况
                return true;  
            if(*str!='\0' && *pattern=='\0')//判断匹配失败的情况
                return false;
            
            if(*(pattern+1)=='*'){//处理有*的情况
                if((*str!='\0' && *pattern=='.') || *str==*pattern)
                    return match(str+1,pattern)||match(str+1,pattern+2)||match(str,pattern+2);//当前字符匹配,处理匹配多次、1次、0次的情况
                else
                    return match(str,pattern+2);//当前不匹配的情况
            }
            else{//处理没*的情况
                if(*str!='\0' && *pattern=='.' || *str==*pattern)
                    return match(str+1,pattern+1);//匹配
                else
                    return false;//不匹配
            }
        }
    };
    

    相关文章

      网友评论

          本文标题:36. 正则表达式匹配

          本文链接:https://www.haomeiwen.com/subject/rlaodctx.html