[LeetCode] Wildcard Matching 外卡匹配

[LeetCode] Wildcard Matching 外卡匹配

 

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false

这道题通配符匹配问题还是小有难度的,这道里用了贪婪算法Greedy Alogrithm来解,由于有特殊字符*和?,其中?能代替任何字符,*能代替任何字符串,那么我们需要定义几个额外的指针,其中scur和pcur分别指向当前遍历到的字符,再定义pstar指向p中最后一个*的位置,sstar指向此时对应的s的位置,具体算法如下:

– 定义scur, pcur, sstar, pstar

– 如果*scur存在

  – 如果*scur等于*pcur或者*pcur为 ‘?’,则scur和pcur都自增1

  – 如果*pcur为’*’,则pstar指向pcur位置,pcur自增1,且sstar指向scur

  – 如果pstar存在,则pcur指向pstar的下一个位置,scur指向sstar自增1后的位置

– 如果pcur为’*’,则pcur自增1

– 若*pcur存在,返回False,若不存在,返回True

 

C 解法一:

bool isMatch(char *s, char *p) {
    char *scur = s, *pcur = p, *sstar = NULL, *pstar = NULL;
    while (*scur) {
        if (*scur == *pcur || *pcur == '?') {
            ++scur;
            ++pcur;
        } else if (*pcur == '*') {
            pstar = pcur++;
            sstar = scur;
        } else if (pstar) {
            pcur = pstar + 1;
            scur = ++sstar;
        } else return false;
    } 
    while (*pcur == '*') ++pcur;
    return !*pcur;
}

 

这道题也能用动态规划Dynamic Programming来解,写法跟之前那道题Regular Expression Matching很像,但是还是不一样。外卡匹配和正则匹配最大的区别就是在星号的使用规则上,对于正则匹配来说,星号不能单独存在,前面必须要有一个字符,而星号存在的意义就是表明前面这个字符的个数可以是任意个,包括0个,那么就是说即使前面这个字符并没有在s中出现过也无所谓,只要后面的能匹配上就可以了。而外卡匹配就不是这样的,外卡匹配中的星号跟前面的字符没有半毛钱关系,如果前面的字符没有匹配上,那么直接返回false了,根本不用管星号。而星号存在的作用是可以表示任意的字符串,当然只是当匹配字符串缺少一些字符的时候起作用,当匹配字符串包含目标字符串没有的字符时,将无法成功匹配。

 

C++ 解法二:

class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size(), n = p.size();
        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
        dp[0][0] = true;
        for (int i = 1; i <= n; ++i) {
            if (p[i - 1] == '*') dp[0][i] = dp[0][i - 1];
        }
        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 {
                    dp[i][j] = (s[i - 1] == p[j - 1] || p[j - 1] == '?') && dp[i - 1][j - 1];
                }
            }
        }
        return dp[m][n];
    }
};

 

类似题目:

Regular Expression Matching

 

参考资料:

https://discuss.leetcode.com/topic/3040/linear-runtime-and-constant-space-solution

https://discuss.leetcode.com/topic/40118/clear-c-dp-solution-similar-to-the-last-matching-problem

 

LeetCode All in One 题目讲解汇总(持续更新中…)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109497.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 音视频编解码常用知识点

    音视频编解码常用知识点目录视频播放器原理流媒体协议封装格式(容器)编解码转码帧(Frame)帧率(Framerate)分辨率比特率(码率)采样率采样位数声道数有损压缩和无损压缩帧内压缩和帧间压缩对称编码和不对称编码音频编码声音数字化三要素音频编码标准视频编码色彩空间RGB色彩空间YUV色彩空间压缩原理熵与冗余帧内编码…

    2022年7月13日
  • 地理加权回归模型案例_地理加权回归不能用哑变量

    地理加权回归模型案例_地理加权回归不能用哑变量目前,GWR已经成为处理空间异质性的主要方法之一。与经典的全局回归模型的OLS不同,GWR是局部回归模型,模型系数是通过观测周围的样本来回归得到。在这里插入图片描述

    2022年9月1日
  • python之初接触

    编程语言相关1什么是编程语言2 编程语言的分类以及优缺点编程语言从诞生开始到现在大致经历了三个阶段:机器语言汇编语言高级语言解释类:执行方式类似于我们日常生活中的“同声翻译”,应

    2022年3月29日
  • DAC904硬件电路「建议收藏」

    DAC904硬件电路「建议收藏」DAC904一、DAC904特性二、电路原理图一、DAC904特性●单电源供电+5V或+3V●高SFDR(无杂散动态范围):在100MSPS64dBc时20MHz输出●低干扰:3PV-S●低功耗:170MW(+5V时)DAC904是一款高速数模转换器,14位分辨率,引脚兼容DAC908、DAC900、DAC902,分别提供8-,10-,12-位分辨率选择。该系列DAC…

    2022年9月20日
  • 数据挖掘项目的生命周期是指_数据挖掘生命周期的数据准备阶段

    数据挖掘项目的生命周期是指_数据挖掘生命周期的数据准备阶段 第一步:数据收集; 第二步:数据清理和转换;          目前有很多技术能用于数据清理和转换:           1、数据类型转换;          2、连续列转换;          3、分组;          4、聚集;          5、缺失值处理;          6、删除孤立点; 第三步:模型构建 

    2022年9月5日
  • PHP5各个版本的新功能和新特性总结

    因为PHP那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣。本文将会介绍自PHP5.2起,直至PHP5.6中增加的新特征本文目录:PHP5.2以前:auto

    2021年12月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号