[LeetCode] Regular Expression Matching 解题报告

本文介绍了一种实现正则表达式匹配的方法,支持‘.’和‘*’两种特殊字符。‘.’可以匹配任意单个字符,而‘*’可以匹配其前导元素的0个或多个实例。文章提供了一个C++代码示例,通过递归方式处理‘*’的多种可能情况。

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

[题目]
mplement regular expression matching with support for ‘.’ and ‘*’.

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

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch(“aa”,”a”) → false
isMatch(“aa”,”aa”) → true
isMatch(“aaa”,”aa”) → false
isMatch(“aa”, “a*”) → true
isMatch(“aa”, “.*”) → true
isMatch(“ab”, “.*”) → true
isMatch(“aab”, “c*a*b”) → true

[中文翻译]
实现正则表达式匹配,支持’.’和’*’。

‘.’ 匹配任何单个字符.
‘*’ 匹配0个或多个前导字符.

需要匹配整个输入的字符串(不是部分).

函数原型如下:
bool isMatch(const char *s, const char *p)

例子:
isMatch(“aa”,”a”) → false
isMatch(“aa”,”aa”) → true
isMatch(“aaa”,”aa”) → false
isMatch(“aa”, “a*”) → true
isMatch(“aa”, “.*”) → true
isMatch(“ab”, “.*”) → true
isMatch(“aab”, “c*a*b”) → true

[解题思路]
普通的字符就一一匹配。
‘.’比较好处理,匹配任意字符。
麻烦的是’*’,使用递归,依次枚举’*’所代表的个数。

思路大致如此,代码实现地比较烦,是我很早以前写的,又没有写注释。
最近很烦,也不想补注释了,谅解。

[C++代码]

class Solution {
private:
    string ts, tp;
    int slen, plen;
public:
    bool isMatch(string s, string p) {
        ts = s; tp = p;
        slen = s.size(); plen = p.size();

        return myMatch(0, 0);
    }

    bool myMatch(int ps, int pp) {
        if (ps == slen && pp == plen)
            return true;
        if (ps < slen && pp == plen)
            return false;

        if (pp + 1 < plen) {
            if ('*' == tp.at(pp + 1)) {
                for (int i = ps; i < slen; i++) {
                    if (ts.at(i) == tp.at(pp) || '.' == tp.at(pp)) {
                        if (myMatch(i + 1, pp + 2))
                            return true;
                    }
                    else break;
                }
                return myMatch(ps, pp + 2);
            }
            else {
                if (ps == slen)
                    return false;
                if (ts.at(ps) == tp.at(pp) || '.' == tp.at(pp))
                    return myMatch(ps + 1, pp + 1);
                else
                    return false;
            }
        }
        else {
            if (ps == slen)
                return false;
            if (ts.at(ps) == tp.at(pp) || '.' == tp.at(pp))
                return myMatch(ps + 1, pp + 1);
            else
                return false;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值