首页 > 其他分享 >LeetCode_0044. 通配符匹配,带字母'*''?'的模式串匹配仅带字母的主串

LeetCode_0044. 通配符匹配,带字母'*''?'的模式串匹配仅带字母的主串

时间:2024-09-15 11:45:48浏览次数:1  
标签:主串 匹配 .. 字母 length 空串 dpLine dp

题目描述

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

  1. '?' 可以匹配任何单个字符。
  2. '*' 可以匹配任意字符序列(包括空字符序列)。
  3. 判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

  • 示例 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 仅由小写英文字母、'?' 或 '*' 组成
    

分析

状态s[0..j] & p[0..i] 的匹配情况可以推出下一状态 s[0..j+1] & p[0..i/i+1] 的匹配情况。

存在'*'匹配0个或多个,因此状态推导关系不仅仅是一维的。

问题可以分解为若干 重叠子问题 :二者的子串匹配 --> 子问题之间存在 二维的状态推导关系 --> 二维动态规划

状态推导

设dp[i][j]表示s[0..j-1] & p[0..i-1]的匹配情况,true/false。

dp的初始化需要考虑空串 ,s为空 or p为空。

  • 初始化,i = 0 时,p[0..i-1]为空串,仅能与空串(j = 0)匹配成功
    dp[0][0] = true;

  • 初始化,j = 0 时,s[0..j-1]为空串,仅能与空串(i = 0)或'...'匹配成功
    当p[0..i-1]是连续的'*'时,dp[i][0] = true;

  • i = [1..p.length()],遍历p[0..p.length()-1],逐行推导
    j = [1..s.length()],遍历s[0..s.length()-1]

    • 若p[i-1] == '*',可不匹配字符,或匹配字符
      dp[i][j] = dp[i-1][j] || dp[i][j-1]

    • 若p[i-1] == '?',匹配字符
      dp[i][j] = dp[i-1][j-1]

    • 若p[i-1] == 字母,与s[j-1]比较,相等就匹配成功,不等就匹配失败
      dp[i][j] = dp[i-1][j-1] && p[i-1] == s[j-1]

实现

dp数组的推导公式可知,dp[i]仅与dp[i-1]有关,可以压缩二维dp数组为一维,注意j=0时的dp值

class Solution {
public:
    bool isMatch(string s, string p) {
        const int sLen = s.length(), pLen = p.length();

        vector<bool> dpLine(sLen + 1, false);
        dpLine[0] = true;

        int dpZeroTrue = 1;
        for(; dpZeroTrue <= pLen && p[dpZeroTrue - 1] == '*'; ++dpZeroTrue);

        // 字符串i-1对应dpi,字符串j-1对应dpj
        for(int i = 1; i <= pLen; ++i) {
            const char pi = p[i - 1];
            if(pi == '*') {
                dpLine[0] = i < dpZeroTrue;
                for(int j = 1; j <= sLen; ++j) {
                    dpLine[j] = dpLine[j - 1] || dpLine[j];
                }
            } else if(pi == '?'){
                for(int j = sLen; j > 0; --j) {
                    dpLine[j] = dpLine[j - 1];
                }
                dpLine[0] = i < dpZeroTrue;
            } else {
                for(int j = sLen; j > 0; --j) {
                    dpLine[j] = dpLine[j - 1] && pi == s[j - 1];
                }
                dpLine[0] = i < dpZeroTrue;
            }
        }

        return dpLine.back();
    }
};

标签:主串,匹配,..,字母,length,空串,dpLine,dp
From: https://www.cnblogs.com/GaogaoBlog/p/18415110

相关文章

  • 【LeetCode 算法笔记】49. 字母异位词分组
    目录问题描述计数法:计数法(用哈希表):排序法:问题描述给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=[“eat”,“tea”,“tan”,“ate”,“nat”......
  • 438. 找到字符串中所有字母异位词
    题目链接438.找到字符串中所有字母异位词思路滑动窗口题解链接官方题解关键点顺序比较;判断的状态量可以依此变更时应当使用“滑动窗口”的方式进行更新时间复杂度\(O(m+(n-m)\times\sum)\)空间复杂度\(O(\sum)\)代码实现:classSolution:de......
  • 基于Node.js+vue职位智能匹配系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网应用的普及,人才招聘市场迎来了前所未有的变革。传统的人才招聘方式往往效率低下,信息不对称,导致求职者难以快速找到合适的工......
  • 二分图最大权完美匹配
    问题给定一个二分图,左部有\(n\)个点,右部有\(m\)个点,边\((u_i,v_j)\)的边权为\(A_{i,j}\)。求该二分图的最大权完美匹配。转化问题可以写成线性规划的形式,设\(f_{i,j}\)表示匹配中是否有边\((u_i,v_j)\),求\[\begin{gather*}\text{maximize}\quad&\sum_{i=1}^n......
  • opencv实战项目二十三:基于BEBLID描述符的特征点匹配实现表盘校正
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、特征点匹配介绍二、特征点检测三、特征描述符计算四,描述符的匹配筛选五,根据匹配结果映射图片六,整体代码:七,效果:前言在数字化时代,图像处理技术的应用日益广泛,其中表盘校正作为一项重要......
  • 未匹配到本域名()有效授权码,请到pbootcms官网获取
    对于新手第一次使用PbootCMS时,可能会遇到“未匹配到本域名()有效授权码”的提示。这是因为域名未授权导致的。即使是本地测试站也需要授权,除非是通过IP地址访问。以下是详细的填写授权码的步骤:步骤详解进入网站后台:在域名后面加上 admin.php 来访问后台,默认的后台入口......
  • 6.用*号输出字母 C 的图案
    【程序6】题目:用*号输出字母C的图案。1.程序分析:可先用'*'号在纸上写出字母C,再分行输出。2.程序源代码:方法一:#输出字母"C"的图案print('****')print('*')print('*')print('*')print('****')方法二:#定义字母"C......
  • UWP WinUI3 传入 AddHandler 的 RoutedEventHandler 类型与事件所需不匹配将抛出参数
    本文记录一个UWP或WinUI3的开发过程中的问题,当开发者调用AddHandler时,所需的Handler参数类型为RoutedEventHandler类型,然而实际上正确类型是需要与所监听事件匹配才能符合预期工作,否则将抛出缺乏信息的参数异常开始之前先惯例吐槽一下,我从2015开始开发UWP应用,然而......
  • 力扣49 字母异位词分组 Java版本
    文章目录题目描述题解注意事项题目描述给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=[“eat”,“tea”,“tan”,“ate”,“nat”,“bat”......
  • 南沙C++信奥老师解一本通题:1203:扩号匹配问题
    ​【题目描述】在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标......