wild card matching

2024-02-27 09:18
文章标签 card wild matching

本文主要是介绍wild card matching,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

 (http://www.leetcode.com/onlinejudge 倒数第三题)

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

这个题目的非递归算法,被网易有道面试官,面到过。并且要求写出程序,其实非递归算法要考虑的东西还是很多的,如果没有见过算法,真是很难写出来。笔者在这里给出递归和非递归算法。仅供参考


题目分析: 

和正则表达式的匹配有点不同的是,在这里*号是不依赖与以前的符号是,是一个通配符。*是一个多重通配符,而*是一个单一通配符。


递归解法

其实题目很容易写出一个递归的方法:

递归方法首先检查输入两个串是否都是空,如果是空,认为已经匹配完毕,直接返回true。

如果被匹配串是空,模式串如果是 *, 那么是true

如果模式串是空,那么结果是false

[cpp]  view plain copy
  1. class Solution {  
  2. public:  
  3.      
  4.     bool isMatch(const char *s, const char *p) {  
  5.       
  6.         if(*s == 0 && *p == 0){ //两个串是否都是空,如果是空,认为已经匹配完毕,直接返回true。  
  7.             return true;  
  8.         }  
  9.         if(*s == 0){ //如果被匹配串是空,模式串如果 全是*,那么就是true  
  10.             while(*p == '*') p++;  
  11.             return !(*p);  
  12.         }  
  13.         if(*p == 0){  
  14.             return false;  
  15.         }  
  16.   
  17.         int i;  
  18.         for( i = 0; s[i] && p[i] ; i++){ //匹配过程  
  19.   
  20.             if(s[i] != p[i]){  
  21.                 if(p[i] == '?'){ //单一通配符  
  22.                     continue;  
  23.                 }  
  24.                 else if(p[i] == '*'){ //多重通配符  
  25.                     s += i;  
  26.                     p += i;  
  27.                     return isMatch(s, p + 1) || isMatch(s + 1, p);//匹配和不匹配,两种情况  
  28.                 }  
  29.                 else{  
  30.                     return false;  
  31.                 }  
  32.             }  
  33.         }  
  34.         return isMatch(s + i, p + i); //匹配剩余的  
  35.     }  
  36. };  


非递归方法

非递归方法的主要思想是,从匹配串和模式串开头匹配,如果发现当前不能匹配了,则检测之前是否出现过 *, 如果有*出现过,则模式串跳过当前不匹配的字符,模式串跳过星号。
例如

abbc  a*c***

第一次 startLoop
i = 0;  a 和 a 匹配成功
i = 1;  b 和 * 发现不能匹配,程序流到 case '*', 因为 * 和 b 可以匹配,所以将 p 和 s 各自 + i ,标记 star为真, 重新开始匹配。

第二次 startLoop
i = 0;  b 和 c 不能匹配 跳到 starcheck 看看 之前是不是有 *, 如果存在 *,则 s + 1, p 不增加(此时p还是 上一个 * 的下一个位置), 然后继续匹配

第三次 startLoop:
i = 0; c = c 可以匹配 
这时候 s[i] == 0
跳出循环
{
[cpp]  view plain copy
  1. while(p[i] == '*')i++;  
  2.         return !(p[i]);  
}
用来检测当 s 串匹配完了以后 p串是不是全为 * ,如果全是*,则可以匹配,否则匹配失败。

[cpp]  view plain copy
  1.     bool isMatch(const char *s, const char *p) {  
  2.   
  3.         int i;  
  4.         bool star = false;  
  5.   
  6. startLoop:  
  7.         {  
  8.             for( i = 0; s[i] ; i++){   
  9.                 switch(p[i])  
  10.                 {   
  11.                 case '?':   
  12.                     break;  
  13.                 case '*'//如果当前 为*, 那么匹配上刚刚不能匹配的那个字符,并且将p移动到 * 结束后的 第一个字符  
  14.                     star = true;  //p 每次指向的位置,要么是最开始,要么是 * 结束的第一个位置  
  15.                     p += i;    
  16.                     s += i;  
  17.                     while(*p == '*'){++p;} //检测p是不是后面全是 *  
  18.                     if(!(*p)) return true;  
  19.   
  20.                     goto startLoop; //重新开始循环, p 指向 * 结束后的 第一个 非*  
  21.                 default:  
  22.                     if(s[i] != p[i]){ //如果 s[i] != p[i]  
  23.                         goto starCheck;  
  24.                     }  
  25.                 }  
  26.             }  
  27.         }  
  28.         while(p[i] == '*')i++;  
  29.         return !(p[i]);  
  30.   
  31. starCheck:  
  32.         {  
  33.             if(star){ //当 s[i] != p[i], 检测 p 之前是不是 *, 如果是 *,那么我们将s 向后移动一个,其实就是枚举 s 到 s[i],和 p[0] 匹配。  
  34.                 s++;   
  35.                 goto startLoop;  
  36.             }  
  37.             return false;  
  38.         }        
  39.     }  

算法是速度是相当快的,在第一种情况下TLE的情况下,算法二仅仅需要 80ms,看来非递归的效率确实是很高的。

这篇关于wild card matching的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/751930

相关文章

leetcode#10. Regular Expression Matching

题目 Implement regular expression matching with support for ‘.’ and ‘*’. '.' Matches any single character.'*' Matches zero or more of the preceding element.The matching should cover the entire input

ssh登录服务器报错“no matching host key type found. Their offer: ssh-rsa,ssh-dss”解决方法

这个错误表明你尝试使用 ssh 连接到远程服务器时,客户端和服务器之间没有匹配的 host key 类型。具体来说,远程服务器提供了 ssh-rsa 和 ssh-dss 类型的 host key,但你的 SSH 客户端配置可能不再支持这些较旧的算法。最近的 OpenSSH 版本默认禁用了不够安全的算法,如 ssh-rsa 和 ssh-dss。 解决方法 临时启用 ssh-rsa: 你可以在

One-Shot Imitation Learning with Invariance Matching for Robotic Manipulation

发表时间:5 Jun 2024 论文链接:https://readpaper.com/pdf-annotate/note?pdfId=2408639872513958656&noteId=2408640378699078912 作者单位:Rutgers University Motivation:学习一个通用的policy,可以执行一组不同的操作任务,是机器人技术中一个有前途的新方向。然而,

LeetCode - 10. Regular Expression Matching

10. Regular Expression Matching Problem's Link  ---------------------------------------------------------------------------- Mean:  给定一个串s和一个自动机p(模糊字符只含有'.'和'*'),问串s是否能够和自动机p匹配. analyse:

NLP-文本匹配-2017:BiMPM【Bilateral Multi-Perspective Matching for Natural Language Sentences】

NLP-文本匹配-2016:BiMPM【Bilateral Multi-Perspective Matching for Natural Language Sentences】

NLP-文本匹配-2016:Compare-Aggregate【A Compare-Aggregate Model for Matching Text Sequences】

NLP-文本匹配-2016:Compare-Aggregate【A Compare-Aggregate Model for Matching Text Sequences】

hdu5159 Card(组合数学)BC26

/* 问题描述 桌子上有a张牌,每张牌从1到a编号,编号为i(1<=i<=a)的牌上面标记着分数i , 每次从这a张牌中随机抽出一张牌,然后放回,执行b次操作,记第j次取出的牌上面分数是 Sj , 问b次操作后不同种类分数之和的期望是多少。 输入描述 多组数据,第一输入数据组数T ,接下来T行,每行两个整数a,b以空格分开 [参数说明] 所有输入均为整数 1<=

M1 card crack

判断卡片类型 这张卡就是本次实现的对象 ,一张废弃的校园卡,以下所有操作都以此卡展开 我们使用flipper的NFC功能扫描该卡片。我们直接read 我们得出最终结果该卡是M1 1K卡,也就是S50卡 。 Mifare 1卡是属于非接触式逻辑加密卡。MIFARE MF1是符合ISO/IEC 14443A的非接触智能卡。其通讯层(MIFARE RF 接口)符合ISO/IEC 14443

PeriodWave: Multi-Period Flow Matching for High-Fidelity Waveform Generation

preprintKorea Seoul, Korea 文章目录 abstractmethodFlow Matching for Waveform GenerationHigh-frequency Information Modeling for Flow Matching demo page, PeriodWave 三者最好,而且能把原声中的噪声去掉,GAN一类声码器做不到的。 Perio

HDU5159--BC--Card(概率写法,和组合写法)

概率方法 要求出和的期望,期望的基本定理, 和的期望 = 各部分期望的和。 E(sum) = E(1) + E(2) + ... + E(x) ; 每个数在b次中只有选到和没选到两种情况,在b次中被选到的概率p =1 -  (1 - 1/x)^b ; 所以每个数的期望也是 i*( 1-(1-1/x)^b ) 得到sum的期望。 #include <cstdio>#in