当前位置: 首页 > article >正文

力扣_字符串3—通配符匹配

题目

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

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

方法

动态规划

  • s s s 长度为 n 1 n_1 n1, p p p 长度为 n 2 n_2 n2
  • 构造 d p n 1 + 1 , n 2 + 1 dp_{n_1+1, n_2+1} dpn1+1,n2+1 数组
    • d p [ i ] [ j ] = = 1 dp[i][j] == 1 dp[i][j]==1,则表示 s [ 0 , i − 1 ] s[0, i-1] s[0,i1] 可以与 p [ 0 , j − 1 ] p[0,j-1] p[0,j1] 匹配
  • 转移
    • p [ j − 1 ] = = ? p[j-1] == ? p[j1]==?,则 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i1][j1] (因为 ? ? ? 可以和任意单个字符匹配)
    • p [ j − 1 ] = = ∗ p[j-1] == * p[j1]==,则,
      • ∗ * 匹配 0 0 0 个字符,则 d p [ i ] [ j ] = d p [ i ] [ j − 1 ] dp[i][j] = dp[i][j-1] dp[i][j]=dp[i][j1] p [ 0 , j − 1 ] p[0,j-1] p[0,j1] s [ 0 , i − 1 ] s[0,i-1] s[0,i1] 是否匹配取决于 p [ 0 , j − 2 ] p[0,j-2] p[0,j2] s [ 0 , i − 1 ] s[0,i-1] s[0,i1] 是否匹配,因为此时 p [ j − 1 ] p[j-1] p[j1] 不参与匹配)
      • ∗ * 匹配 1 1 1 个字符,则 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i1][j] p [ 0 , j − 1 ] p[0,j-1] p[0,j1] s [ 0 , i − 1 ] s[0,i-1] s[0,i1] 是否匹配取决于 p [ 0 , j − 1 ] p[0,j-1] p[0,j1] s [ 0 , i − 2 ] s[0,i-2] s[0,i2] 是否匹配,因为此时 p [ j − 1 ] p[j-1] p[j1] 匹配了 s [ i − 1 ] s[i-1] s[i1],还要继续看 p [ j − 1 ] p[j-1] p[j1] 是否匹配 s [ i − 2 ] s[i-2] s[i2]
      • 综上 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i1][j] d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j1]
    • p [ j − 1 ] p[j-1] p[j1] 为字母,
      • s [ i − 1 ] = = p [ j − 1 ] s[i-1] == p[j-1] s[i1]==p[j1],则 d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i1][j1],否则为0

代码

class Solution {
public:
    bool isMatch(string s, string p) {
        int n1 = s.size();
        int n2 = p.size();
        vector<vector<int>> dp(n1+1, vector<int>(n2+1));
        dp[0][0] = 1;
        for (int i = 1; i <= n2; ++i) {
            if (p[i - 1] == '*') {
                dp[0][i] = true;
            }
            else {
                break;
            }
        }
        for(int i = 1; i <= n1; i++){
            for(int j = 1; j <= n2; j++){
                if(p[j-1] == '?'){
                    dp[i][j] = dp[i-1][j-1];
                }
                else if(p[j-1] == '*'){
                    dp[i][j] = dp[i][j - 1] | dp[i - 1][j];
                }
                else{
                    if(p[j-1] == s[i-1]){
                        dp[i][j] = dp[i-1][j-1];
                    }
                    else{
                        dp[i][j] = 0;
                    }
                }
            }
        }
        return dp[n1][n2];
    }
};

http://www.kler.cn/a/228359.html

相关文章:

  • 接口 V2 完善:基于责任链模式、Canal 监听 Binlog 实现数据库、缓存的库存最终一致性
  • C++ 二叉搜索树
  • AIGC视频生成国产之光:ByteDance的PixelDance模型
  • GD32L233RB 驱动数码管
  • 爬虫基础之爬取某站视频
  • 【深度学习】2.视觉问题与得分函数
  • 机器学习复习(8)——基本概念
  • kubesphere部署k8s-v1.23.10
  • 2024美赛数学建模C题完整论文教学(含十几个处理后数据表格及python代码)
  • 机器学习本科课程 实验4 支持向量机
  • 视频融合平台EasyCVR推流成功但平台显示不在线是什么原因?
  • HarmonyOS ArkTS Button基本使用(十八)
  • 【go】结构体切片去重
  • 【Node系列】node中的流(Stream)
  • 16-Verilog实现二线制I2C CMOS串行EEPROM的读写操作
  • 【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
  • ArrayList和LinkedList的区别是什么
  • ASP.NET Core 预防开放式重定向攻击
  • JAVA斗地主逻辑-控制台版
  • 动态颗粒背景,适合VUE、HTML前端显示
  • kmp算法讲解
  • 华清远见嵌入式学习——春节作业——2.5日
  • [ubuntu]add-apt-repository 添加以及移除
  • 假期作业 2.2
  • 哪种安全数据交换系统,可以满足信创环境要求?
  • 视频业务像素、带宽、存储空间计算