• 正则表达式匹配★★★


    题目描述

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

    aaa a*aaa
    abbbc ab*c
    abc ab*c
    abcaaab a.*a.b

     
    解题思路:
    问题的核心在于对“*”的情况分析。
    如果当前字符的下一个字符不是“*”,那么如果当前字符不匹配就返回失败,否则递归下一个字符位置。
    如果当前字符的下一个字符是“*”,那么需要考虑两种情况:1.匹配0个,不管当前字符是否相同,都需要pattern+2向后走2个字符; 2.匹配一个或者匹配多个,那么当前字符肯定是相同的,我们让str+1向后走1个字符,匹配一个的就变成匹配0个的情况,匹配多个的只需要一直向后匹配即可。
    class Solution {
    public:
        bool match(char* str, char* pattern)
        {
            //同时走到尾部表示匹配成功
            if(*str == '' && *pattern == '')
                return true;
            //如果字符串没有结束,模式串结束了,则表示匹配失败
            //如果模式串没有结束,而字符串结束了,那么还有可能是匹配0个的情况存在
            if(*str != '' && *pattern == '')
                return false;
            //根据当前字符的下一个字符判断是否是*
            if(*(pattern+1) != '*'){
                if(*str == *pattern || ( *str != '' && *pattern == '.' )){
                    return match(str+1, pattern+1);
                }else{
                    return false;
                }
            }else{
                if(*str == *pattern|| ( *str != '' && *pattern == '.' ) ){
                    //即使当前字符相同,也可以匹配0个
                    bool matchZero = match(str, pattern+2);
                    //匹配一个和多个算是一种情况,匹配一个在下次递归中会转化成匹配0次的情况
                    bool matchOneMulti = match(str+1, pattern);
                    return matchZero || matchOneMulti;
                }else{
                    //匹配0个的情况
                    return match(str, pattern+2);
                }
            }
        }
    }
    

      

  • 相关阅读:
    转载Dockerfile 中 RUN, CMD, ENTRYPOINT 的区别
    在linux上通过ssh使用github
    dns服务
    centos6 free 和 centos 7的free 的差异与对比
    无重复字符的最长子串
    go get命令在go mod目录下与正常目录执行的区别
    安装git
    转载 筛子算法之golang实现求素数解析
    Go语言基础之并发
    go之无缓冲channel(通道)和有缓冲channel(通道)
  • 原文地址:https://www.cnblogs.com/chengsheng/p/10694838.html
Copyright © 2020-2023  润新知