53-正则表达式匹配

一、题目描述

实现正则表达式匹配,支持'.' 和'*';

  1. ‘.’:匹配任何单个字符。
  2. '*':匹配零个或多个前面的元素。

匹配应覆盖整个输入字符串(不是部分)。
函数原型应该是:bool isMatch(char* s, char* p)
    s可以是空的并且只包含小写字母a-z。
    p可以是空的并且只包含小写字母a-z和字符.要么*。

二、题意分析

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false

“.”是指匹配任意“一个”字符;
“*”是指匹配任意“多个”p中“*”前面出现的字符,上例中,mis*i的“*”指它前面的字符s可以出现多次,但是匹配多次后,后面一定要有i或者.才能匹配。

三、解题算法

/***********************************

Author:tmw
date:2018-5-4
***********************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/**递归方法 时间复杂度O(n) 空间复杂度O(1) **/
bool isMatch(char* s, char* p) /**s为文本串,p为匹配串,判定p是否正则匹配s**/
{
    if( *p == '\0')  return *s == '\0';

    /**当前p的下一个元素不是"*"时,则必须一一匹配**/
    if( *(p+1) != '*' )
    {
        /**判定一一匹配的情况,把.考虑在内**/
        if( *p == *s || (*p == '.' && *s != '\0') )
            return isMatch( s+1, p+1 );
        else
            return false;
    }
    /**当前p的下一个元素是“*”时,在跳过当前s位置上重复当前p位置上元素的元素**/
    else
    {
        while( *p == *s || (*p == '.' && *s != '\0') )
        {
            /**【特殊情况】
                当s位置上的元素与p+2位置上的元素匹配时,说明p位置上元素与p+2位置上元素相同
                则应该把p+2位置上的元素也包括在“*”中任意元素任意个数中的一个,否则会返回错误
                【例如】
                s="aaa"
                p="a*a"
                若不加这个判断,*会把s中所有的a匹配完直到s=='\0',但此时p还有一个a,程序会返回false
                实际上这个*后面的a应该算成*中任意个数的其中一个,那么就变成了s=='\0'&&p=='\0',返回true
            **/
            if( isMatch( s, p+2 ) )
                return true;
            s++;
        }
        return isMatch(s,p+2);
    }
}

                                                                                          梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值