【LeetCode】44. Wildcard Matching (2 solutions)

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

 

解法一:

这题想法参考了https://oj.leetcode.com/discuss/10133/linear-runtime-and-constant-space-solution,

类似于一种有限状态机的做法。

主要思想如下:

由于*匹配多少个字符是不一定的,于是首先假设*不匹配任何字符。

当后续匹配过程中出错,采用回溯的方法,假设*匹配0个字符、1个字符、2个字符……i个字符,然后继续匹配。

因此s需要有一个spos指针,记录当p中的*匹配i个字符后,s的重新开始位置。

p也需要一个starpos指针指向*的位置,当回溯过后重新开始时,从starpos的下一位开始。

class Solution {
public:bool isMatch(const char *s, const char *p) {char* starpos = NULL;char* spos = NULL;while(true){if(*s == 0 && *p == 0)//match allreturn true;else if(*s == 0 && *p != 0){//successive *p must be all '*'while(*p != 0){if(*p != '*')return false;p ++;}return true;}else if(*s != 0 && *p == 0){if(starpos != NULL){//maybe '*' matches too few chars in sp = starpos + 1;s = spos + 1;spos ++;    //let '*' matches one more chars in s
                }else//*s is too longreturn false;}else{if(*p == '?' || *s == *p){s ++;p ++;}else if(*p == '*'){starpos = (char*)p;spos = (char*)s;p ++;   //start successive matching from "'*' matches non"
                }//currently not matchelse if(starpos != NULL){//maybe '*' matches too few chars in sp = starpos + 1;s = spos + 1;spos ++;    //let '*' matches one more chars in s
                }else//not matchreturn false;}}}
};

 

解法二:

模仿Regular Expression Matching的递归做法,小数据集上能过。

当*数目太多时会超时。

class Solution {
public:bool isMatch(const char *s, const char *p) {if(*p == 0)return (*s == 0);if(*p == '*'){//case1: *p matches 0 chars in sif(isMatch(s, p+1))return true;//case2: try all possible numberswhile(*s != 0){s ++;if(isMatch(s, p+1))return true;}return false;}else{if((*s==*p) || (*p=='?'))return isMatch(s+1, p+1);elsereturn false;}}
};

以下是我的测试代码,小数据上全部通过:

int main()
{Solution s;cout << s.isMatch("aa","a") << endl;cout << s.isMatch("aa","aa") << endl;cout << s.isMatch("aaa","aa") << endl;cout << s.isMatch("aa","*") << endl;cout << s.isMatch("aa","a*") << endl;cout << s.isMatch("ab","?*") << endl;cout << s.isMatch("aab","c*a*b") << endl;return 0;
}

 

转载于:https://www.cnblogs.com/ganganloveu/p/4161767.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ANTLR 4(一)Getting Started

1. 配置java环境 安装jdk1.7以上版本&#xff0c;我装的是“jdk-8u181-windows-x64.exe”。 设置 “C:\Program Files\Java\jdk1.8.0_181\bin" 到path环境变量。 设置 "C:\Program Files\Java\jdk1.8.0_181" 到 JAVA_HOME 环境变量。 设置 "%JAVA_HOME%\l…

【iOS】Quartz2D图片剪切

一、使用Quartz2D完成图片剪切1.把图片显示在自定义的view中  先把图片绘制到view上。按照原始大小&#xff0c;把图片绘制到一个点上。  代码&#xff1a; 1 - (void)drawRect:(CGRect)rect 2 { 3 UIImage *image2[UIImage imageNamed:"me"]; 4 [image2…

InstallShield 2020

1.新建工程&#xff1a;HOME-New-Basic MSI 2.Gereral Information设置&#xff08;根据需求自行设置&#xff0c;例如下图&#xff09; 3.Files and Folders设置 a.将需打包工程拖拽至下方目标文件夹内 b.创建新的Feature c.设置结果如下 4.Shortcuts设置 a.Desktop右键-New…

iOS项目开发— CoreLocation的定位服务和地理编码与发编码实现

一、CoreLocation简介 1.在移动互联网时代&#xff0c;移动app能解决用户的很多生活琐事&#xff0c;比如 &#xff08;1&#xff09;导航&#xff1a;去任意陌生的地方 &#xff08;2&#xff09;周边&#xff1a;找餐馆、找酒店、找银行、找电影院 2.在上述应用中&#xff0c…

OpenGL-坐标系

笛卡尔坐标系 二维绘图&#xff1a;笛卡尔坐标有一个X轴和一个Y轴组成&#xff0c;X轴为水平方向&#xff0c;Y轴为垂直方向&#xff0c;X和Y相互垂直二维笛卡尔坐标系 三维绘图&#xff1a;笛卡尔坐标多了一个Z轴&#xff0c;Z轴同时垂直于X和Y轴。Z轴的实际意义代表着三维物…

UML类图与类间六种关系表示

1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助开发人员理解系统,它是系统分析和设计阶段的重要产物,也是系统编码和测试…

PlacementBrowser源码分析

PlacementBrowser的源码在 Editor/PlacementMode下面 一、Placement分类的创建 1. Placement分类被存贮在 FPlacementModeModule 的成员变量 Categories里面。 2. 在 FPlacementModeModule::StartupModule() 创建出所有的Placement分类 3. 每个大类由RegisterPlacementCat…

menu源码分析

1. 菜单根据功能不同被划分了不同的section&#xff0c;不同的section的源码被分布在不同的地方 例如&#xff0c;主菜单的源码在Editor/Mainframe&#xff0c;datavaildation菜单的源码在Plugins\Editor\DataValidation下 2. 以主菜单为例&#xff0c;菜单以如下方法构建 首先…

根据select不同的选项实现相应input框添加项的显示

实现效果&#xff1a; 1.单击包时&#xff0c;显示包时的添加项 2.单击包里程&#xff0c;显示包里程的添加项 二 代码实现&#xff1a; 给select添加change事件 获取当前select的value 根据value判断对象显示其添加项框 <script> $(document).ready(function() {$(#typ…

内联汇编用法

在 Linux 代码中&#xff0c;经常可以看到在 C 代码中&#xff0c;嵌入部分汇编代码&#xff0c;这些代码要么是与硬件体系相关的&#xff0c;要么是对性能有关键影响的。 在很久以前&#xff0c;我特别惧怕内嵌汇编代码&#xff0c;直到后来把汇编部分的短板补上之后&#xf…

epoll怎么实现的

epoll 可以说是编写高性能服务端程序必不可少的技术&#xff0c;在介绍 epoll 之前&#xff0c;我们先来了解一下 多路复用I/O 吧。 多路复用I/O 多路复用I/O&#xff1a;是指内核负责监听多个 I/O 流&#xff0c;当任何一个 I/O 流处于就绪状态&#xff08;可读或可写&#…

平衡树以及AVL树

平衡树是计算机科学中的一类数据结构。 平衡树是计算机科学中的一类改进的二叉查找树。一般的二叉查找树的查询复杂度是跟目标结点到树根的距离&#xff08;即深度&#xff09;有关&#xff0c;因此当结点的深度普遍较大时&#xff0c;查询的均摊复杂度会上升&#xff0c;为了更…

法线和法线贴图

法线和法线贴图 1、法线无处不在&#xff0c;这是图形学基础中的基础。 2、法线贴图&#xff0c;凹凸图&#xff0c;位移图等等&#xff0c;在图形学历史上有着比较重要的位置&#xff0c;在很多图形学的架构中都有应用&#xff0c;典型的例如延迟渲染架构。 法线 法线&…

Unicode、UTF-8、UTF-16

计算机起源于美国&#xff0c;上个世纪&#xff0c;他们对英语字符与二进制位之间的关系做了统一规定&#xff0c;并制定了一套字符编码规则&#xff0c;这套编码规则被称为ASCII编码 ASCII 编码一共定义了128个字符的编码规则&#xff0c;用七位二进制表示 ( 0x00 - 0x7F ), …

IE11 全新的F12开发者工具

我讨厌debug&#xff0c;相信也没多少开发者会喜欢。但是当代码出错之后肯定是要找出问题出在哪里的。不过网页开发的时候遇到 BUG 是一件再正常不过的事情了&#xff0c;我们不能保证自己的代码万无一失&#xff0c;于是使用浏览器的开发者工具调试是我们解决问题最快捷的方法…

OpenXLSX 中文字段读取问题

在读取excel的时候发现有些中文字段无法读取&#xff0c;通过把excel文件解压后对比发现&#xff0c;正常读取和不 能正常读取的中文字段在sharedString.xml中存储的格式有差异&#xff0c;取其中一个字段&#xff0c;如下图&#xff1a; 正常读取的 不能读取的 对比可以看到…

[翻译] ZLHistogramAudioPlot

ZLHistogramAudioPlot A hardware-accelerated audio visualization view using EZAudio, inspired by AudioCopy. ZLHistogramAudioPlot was originally developed for Murmur. 这是使用了EZAudio,一个硬件加速的audio可视化view,灵感来自于AudioCopy.ZLHistogramAudioPlot这个…

一. NSIS介绍

概述 最近需要写一个安装程序&#xff0c;比对了一下现有的安装工具&#xff0c;最后选定了NSIS&#xff0c;最主要的原因一是开源、二是灵活。 下面把我的要求简单列举下&#xff1a; 1、需要检查系统环境是否满足要求 2、需要界面友好的安装过程 3、需要一些自定义界面&…