leetcode 10. 正则表达式匹配

参考:https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/dong-tai-gui-hua-zhi-zheng-ze-biao-da
题目:https://leetcode-cn.com/problems/regular-expression-matching/

'.' 匹配任意单个字符, 一一对应。
'*' 匹配零个或多个前面的那一个元素。
当前的选择只有两个:匹配 0 次、匹配 1 次。
通过保留 pattern 中的「*」,同时向后推移 text,来实现字符重复匹配多次的功能。
class Solution {
public:
    ///正则表达式匹配 leetcode 10
    string text, pat;
    map<pair<int, int>, bool> memo; //备忘录
    //dp(i, j) : text[i..last], pat[j..last]是否匹配
    bool dp(int i, int j) { //递归函数
        if(memo.find(make_pair(i, j)) != memo.end()) // (i, j) existed
            return memo[make_pair(i, j)];
        if(j == pat.size()) // 遍历pat完毕
            return i == text.size();
        //匹配当前字符
        bool first = i < text.size() && (pat[j] == text[i] || pat[j] == '.');
        bool ans;
        if(j <= pat.size() - 2 && pat[j + 1] == '*') {
            // 有 * 通配符, ans = 匹配0次 or 匹配一次
            ans = dp(i, j + 2) || (first && dp(i + 1, j));
        }
        else {
            //没有 '*', ans = 匹配当前字符 and 匹配 index+1 的部分
            ans = first && dp(i + 1, j + 1);
        }
        memo[make_pair(i, j)] = ans;
        return ans;
    }
    bool isMatch(string s, string p) { //接口函数
        text = s;
        pat = p;
        return dp(0, 0);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值