LeetCode简易题解--010

本文介绍了一种正则表达式完全匹配字符串的算法实现,包括核心函数matchHere和matchStar,支持字符‘.’和‘*’的匹配规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料:http://blog.chinaunix.net/uid-26822401-id-3150018.html

题目要求:string s是要检测的字符串,string p是正则表达式。要求正则表达式完全匹配字符串
正则表达式只包含普通字符和:

‘.’ Matches any single character.
‘*’ Matches zero or more of the preceding element.

先上代码:

class Solution {
public:
    bool isMatch(string s, string p) {
        return matchHere(s.c_str(), p.c_str());
    }
    // text为测试字符串,reg为正则表达式
    bool matchHere(const char* text, const char* reg) {
        if (reg[0] == '\0')
            return *text == '\0';
        if (reg[1] == '*')
            return matchStar(reg[0], text, reg + 2);
        if (*text != '\0' && (reg[0] == '.' || reg[0] == *text))
            return matchHere(text + 1, reg + 1);
        return false;  // 如果以上条件都都不满足,说明匹配失败
    }
    // c为通配符匹配的字符
    bool matchStar(char c, const char* text, const char* reg) {
        do {
            if (matchHere(text, reg))
                return true;
        } while (*text != '\0' && (*text++ == c || c == '.'));
        return false;  // text从初始位置到末尾全都匹配失败,则最终结果就是匹配失败。
    }
};

先看主函数bool isMatch(string s, string p),它直接调用函数bool matchHere(const char* text, const char* reg)并返回它的返回值,因此匹配与否要看matchHere函数。

接着看matchHere函数。先看11 、12行。这两行说明:text指向的字符匹配目前reg指向的字符,那么两个指针都向前移动一位并接着调用matchHere过程。再看10、11行,这两行说明:在匹配过程中遇到了正则表达式的通配符,那么就要对含有通配符的情况进行检测,这通过调用bool matchStar(char c, const char* text, const char* reg)完成。最后看8 、9行。这两行说明:正则表达式已经匹配完了,由于题目要求是完全匹配,所以这时只有text也匹配完成了才能说正则表达式完全匹配字符串

最后看matchStar。这个函数检测遇到了通配符的情况。由于*匹配0个或多个,所以11行return matchStar(reg[0], text, reg + 2);才直接将text传入该函数。matchStar函数执行第一遍循环时测试的就是通配符匹配0个的情况。如果匹配失败,令text一直往前移动再进行匹配,直到text结束或者匹配成功。

以上过程执行到最后,都是要在8、9行处返回,只有当执行到最后,textreg都走到了末尾才能算是完成了匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值