【剑指offer】正则表达式匹配

题目描述

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

思路:

1)首先这个正则表达式匹配指字符串能与模式中的每个字符按照规则完全进行匹配,即需要同时遍历到字符串的末尾及模式的末尾才算完全匹配

2)若某个字符不匹配则直接返回 f a l s e false false;按照规则有如下几种方式表示字符匹配成功:

  • 如果模式串的下一个字符为 ∗ * :如果出现接下来的情况 ( 1 ) (1) (1)当前字符串的字符与模式串中的字符匹配 ( 2 ) (2) (2)模式串的字符为 . . .且字符串没有遍历到末尾,则接下来的匹配策略就可能出现三种【 m a t c h C o r e ( s t r + 1 , p a t t e r n + 2 ) ∣ ∣ m a t c h C o r e ( s t r + 1 , p a t t e r n ) ∣ ∣ m a t c h C o r e ( s t r , p a t t e r n + 2 ) ; matchCore(str + 1, pattern + 2) || matchCore(str + 1, pattern) || matchCore(str, pattern + 2); matchCore(str+1,pattern+2)matchCore(str+1,pattern)matchCore(str,pattern+2);】,因为出现 ( 1 ) (1) (1)情况时,可以让当前匹配的字符出现任意多次,那么当出现 0 0 0次时,即为 ( s t r , p a t t e r n + 2 ) (str,pattern + 2) (strpattern+2),当出现 1 1 1次时,即为 ( s t r + 1 , p a t t e r n + 1 ) (str + 1, pattern + 1) (str+1,pattern+1),当出现 2 2 2次或多次时,即为 ( s t r + 1 , p a t t e r n ) (str + 1, pattern) (str+1,pattern),同理 ( 2 ) (2) (2)也可以推导出结果;否则就只有一种匹配策略【 m a t c h C o r e ( s t r , p a t t e r n + 2 ) ; matchCore(str, pattern + 2); matchCore(str,pattern+2);】,因为不出现上述两种情况,则必须得让其出现 0 0 0次,那么即为 ( s t r , p a t t e r n + 2 ) (str, pattern + 2) (str,pattern+2)
  • 如果模式串得字符与字符串字符相等或者模式串的字符为.且字符串的字符未到末尾,则下一个匹配的即为 ( s t r + 1 , p a t t e r n + 1 ) (str + 1, pattern + 1) (str+1,pattern+1)
class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if (str == nullptr || pattern == nullptr)
            return false;
        return matchCore(str, pattern);
    }
    bool matchCore(char* str, char* pattern) {
        if (*str == '\0' && *pattern == '\0')
            return true;
        if (*str != '\0' && *pattern == '\0')
            return false;
        if (*(pattern + 1) == '*') {
            if (*pattern == *str || (*pattern == '.' && *str != '\0')) {
                return matchCore(str + 1, pattern + 2)
                    || matchCore(str + 1, pattern)
                    || matchCore(str, pattern + 2);
            }
            else {
                return matchCore(str, pattern + 2);
            }
        }
        if (*pattern == *str || (*pattern == '.' && *str != '\0')) 
            return matchCore(str + 1, pattern + 1);
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值