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

LintCode第192题-通配符匹配

描述

给定一个字符串 s 和一个字符模式 p ,实现一个支持 '?' 和 '*' 的通配符匹配。匹配规则如下:

  • '?' 可以匹配任何单个字符。
  • '*' 可以匹配任意字符串(包括空字符串)。

两个串完全匹配才算匹配成功。

样例

样例1

 
输入:
"aa"
"a"
输出: false

输出2

 
输入:
"aa"
"aa"
输出: true

输出3

 
输入:
"aaa"
"aa"
输出: false

输出4

 
输入:
"aa"
"*"
输出: true
说明: '*' 可以替换任何字符串

输出5

 
输入:
"aa"
"a*"
输出: true

样例6

 
输入:
"ab"
"?*"
输出: true
说明: '?' -> 'a' '*' -> 'b'

样例7

 
输入:
"aab"
"c*a*b"
输出: false

思路:

难点在于该题的初始化 转移方程 

初始化:

dp[0][j]=dp[0][j-1];

转移方程:

匹配分为3部分 普通字符匹配 ?匹配 *匹配 

//如果是普通匹配 那么就是

dp[i][j]=dp[i-1][j-1];

//如果是p的字符是?情况的匹配

dp[i][j]=dp[i-1][j-1];

//如果是p的字符是*的情况下的匹配

dp[i][j]=dp[i][j-1] || dp[i-1] [j];

dp[i][j]=dp[i][j-1]用于s是空字符串 p是*的情况

dp[i][j]=dp[i-1] [j];//这个就是当p[j]为字符*的时候 * 可以不匹配任何字符,只是“存在但不参与匹配” 所以选择忽略掉

代码如下:

public class Solution {

    public boolean isMatch(String s, String p) {

        int m = s.length();

        int n = p.length();

        boolean[][] dp=new boolean[m+1][n+1];

        dp[0][0]=true;//空串匹配空串

        //初始化

        for(int j=1;j<=n;j++)

        {

            if(p.charAt(j-1)=='*')

            {

                dp[0][j]=dp[0][j-1]; 继承上一个状态

            }else {
                break; // 一旦不是 *,后面都不可能匹配空串了
                    }

        }

        for(int i=1;i<=m;i++)

        {

            for(int j=1;j<=n;j++)

            {

                char scharacter=s.charAt(i-1);

                char pcharacter=p.charAt(j-1);

                if(scharacter==pcharacter|| pcharacter == '?')

                {

                    dp[i][j]=dp[i-1][j-1];

                }else if(pcharacter=='*')

                {

                    dp[i][j] = dp[i][j - 1] || dp[i - 1][j];

                }else

                {

                    dp[i][j]=false;

                }

            }

        }

        return dp[m][n];

    }

}

相关文章:

  • 解决 Ubuntu 下 VTune 无法收集 CPU 硬件时间计数数据的问题
  • FramePack:让视频生成更高效、更实用
  • Vue2集成ElementUI实现左侧菜单导航
  • 电子电器架构 ---软件定义汽车的电子/电气(E/E)架构
  • HarmonyOS-ArkUI: animateTo 显式动画
  • mapbox进阶,实现掩膜效果,并控制掩膜透明度
  • OpenCV---图像预处理(四)
  • 使用 Flutter 遇坑小计
  • Uniapp:pages.json页面路由
  • ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之IS31FL3216)
  • 【无人机】无人机的电调校准,ESC Calibration,PX4使用手册电调校准详细步骤
  • 超详细实现单链表的基础增删改查——基于C语言实现
  • 基于 FFmpeg 的音视频处理基础原理与实验探究
  • 运维概述(linux 系统)
  • 《解锁增强型上下文学习,打造你的专属智能助手》
  • 徐州服务器租用:虚拟主机的应用场景
  • Spring AI MCP
  • Linux之信号
  • Linux——系统安全及应用
  • 2025年pta团队设计天梯赛题解
  • 中印尼“2+2”:中国周边外交的范式突破与东南亚棋局重构
  • 淄博张店区国资公司挂牌转让所持“假国企”股权,转让底价为1元
  • 世遗X时尚,七匹狼这场大秀秀出中国文化独特魅力
  • 城事|2小时40分42秒,天工夺冠!全球首个人形机器人半马开跑
  • 《王牌对王牌》确认回归,“奔跑吧”将有主题乐园
  • 一图看懂|特朗普政府VS美国顶尖高校:这场风暴如何刮起?