当前位置: 首页 > 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团队设计天梯赛题解
  • 三亚回应“买水果9斤变6斤”:反映属实,拟对流动摊贩罚款5万元
  • 印尼巴厘岛多地停电,疑似海底电缆发生故障
  • 屠呦呦当选美国科学院外籍院士
  • 黄育奇当选福建惠安县人民政府县长
  • 普京与卢卡申科举行会晤,将扩大在飞机制造等领域合作
  • 解读|特朗普“助攻”下加拿大自由党“惨胜”,卡尼仍需克服“特鲁多阴影”