Leetcode 44 通配符匹配

Leetcode44通配符匹配

    • [题解1 枚举情况(数学思维)](#题解1 枚举情况(数学思维))
    • [题解2 DP](#题解2 DP)

给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 '?' 和 '*' 匹配规则的通配符匹配:

  • '?' 可以匹配任何单个字符
  • '*' 可以匹配任意字符序列(包括空字符序列)
  • 判定匹配成功的充要条件是:字符模式必须能够完全匹配输入字符串(而不是部分匹配)
cpp 复制代码
示例 1:
输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:
输入:s = "aa", p = "*"
输出:true
解释:'*' 可以匹配任意字符串。

示例 3:
输入:s = "cb", p = "?a"
输出:false
解释:'?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

提示:

  • 0 <= s.length, p.length <= 2000
  • s 仅由小写英文字母组成
  • p 仅由小写英文字母、'?''*' 组成

题解1 枚举情况(数学思维)

cpp 复制代码
class Solution {
public:
    bool isMatch(string s, string p) {
    /*
    注意:在自写代码的第一版里,未考虑到p短s回溯位置不确定的情况
    	  Key: startIdx和matchIdx
	*/
        int i=0, j=0, startIdx=-1, matchIdx=-1;
        const int m = s.size(), n = p.size();
        while(i < m){
            if(j < n && (s[i]==p[j] || '?'==p[j])){
                i ++;
                j ++;
            }else if(j < n && '*' == p[j]){
                startIdx = j;
                matchIdx = i;
                // '*'匹配空字符
                j ++;
            }else if(startIdx != -1){
                // '*'不匹配空字符, s[matchIdx]被'*'替掉
                j = startIdx+1;
                i = ++matchIdx;
            }else return false;
        }
        // 检查p末尾是否可以匹配'*'
        while(j < n && '*' == p[j]) j++;
        return j == n; 
    }
};

题解2 DP

cpp 复制代码
class Solution {
public:
    bool isMatch(string s, string p) {
        const int m = s.size();
        const int n = p.size();
        // dp下标代表长度,所以需要多申请1b
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        dp[0][0] = 1;

        // 先检查边界(转移函数会用)
        for(int i=1; i <= n; i++){
            if('*' == p[i-1]) dp[0][i] = 1;
            // 出现了非*就不满足了
            else break;
        }
        // dp转移(双循环模板)
        for(int i=1; i <= m; i++){
            for(int j=1; j <=n; j++){
                if('*' == p[j-1]) dp[i][j] = dp[i-1][j] || dp[i][j-1];
                else if('?' == p[j-1] || s[i-1] == p[j-1]) dp[i][j] = dp[i-1][j-1];
            }
        }
        return dp[m][n];
    }
};
相关推荐
星星.72215 分钟前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
sel_916 分钟前
【OPD论文导读(二)】OPD(On-Policy Distillation)全景调研:十篇论文讲透“在自己生成的内容上学习“这件事
人工智能·python·深度学习·学习·算法·语言模型
动词ing18 分钟前
【学习笔记】数据结构(数组长度和关键特性+快慢指针+左右指针)
数据结构·笔记·学习
金幄科技1 小时前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程
M78佐菲1 小时前
Linux学习笔记:文件IO
linux·笔记·学习·算法
lhldsg2 小时前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序
BSD_HY2 小时前
薄膜开关矩阵扫描电路设计中的防鬼键措施
人工智能·算法·矩阵·人机交互·薄膜开关·源头工厂·深圳工厂
linux-hzh2 小时前
百日算法修炼 · Day 17
数据结构·算法
XUEYUAN52122 小时前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
sel_92 小时前
【多轮对话论文导读(七)】多轮对话论文阅读笔记:从数据生成、用户模拟到上下文重构与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·语言模型·自然语言处理