zoukankan      html  css  js  c++  java
  • 正则表达式匹配★★★

    题目描述

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

      

  • 相关阅读:
    用OpenStack界面轻松创建虚拟机的你,看得懂虚拟机启动的这24个参数么?
    Qemu,KVM,Virsh傻傻的分不清
    我是虚拟机内核我困惑?!
    不是技术也能看懂云计算,大数据,人工智能
    有了Openvswitch和Docker,终于可以做《TCP/IP详解》的实验了!
    FIO性能测试
    Python第三方打包库——PyInstaller
    Python函数和代码复用
    Python分支结构和循环结构
    Python基础随机数库——random
  • 原文地址:https://www.cnblogs.com/chengsheng/p/10694838.html
Copyright © 2011-2022 走看看