每日算法之三十五: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
要注意的就是'*'能够代表随意长度的字符,甚至能够是0个。也就是能够忽略。以下是简单的分析思路:
1)两个辅助指针分别指向模式串和比較字符串,假设当前两个字符相等(可能是'?
')。两个指针都加一比較下一个字符。
2)假设比較字符串当前字符是星号,由于星号可能代表0个字符或者多个字符,零个字符就代表比較字符串的下一个字符和模式串的当前字符比較,假设不相等。说明不是代表零个字符,这个时候就要用比較字符串的下一个跟模式串的下一个比較。
假设相等说明可能代表零个字符。那么就等于运行了第一步。直到遇到不相等的字符时,说明星号可能代表了较多的字符。而我们仅仅是吃掉了较少的字符。这个时候我们就应该回退到星号的后一个字符,去跟模式串之前标记不相等的位置的后一个去比較。
因此。在遇到星号的时候我们应该标记模式串和比較字符串的位置,当遇到不相等的时候模式串的标记后移一位,说明星号多代表了一个字符。
3)最后比較字符串可能还剩下比較多的星号,应为星号可能代表零个字符,一次要忽略掉这些。
4)最后查看比較字符串是否到尾部就说明两个字符串是否匹配。
代码例如以下:
class Solution {
public:
bool isMatch(const char *s, const char *p) {
const char* star = nullptr;
const char* rs = nullptr;
while(*s) {
if(*s == *p || *p == '?
') { //match
s++; p++;
continue;
}
if(*p == '*') {
star = p; // record star
p++; //match from next p
rs = s; // record the position of s , star match 0,从匹配零个字符開始
continue;
}
if(star != nullptr) { //if have star in front then backtrace
p = star + 1; //reset the position of p
s = rs + 1;
rs ++; //star match 1,2,3,4,5....每次都多吃掉一个字符
continue;
}
return false; //if not match return false,能运行到这步说明发生了不匹配
}
while(*p == '*') p++; //skip continue star
return *p == '\0'; // successful match。之前s已到结尾。看p是否遍历完代表是否匹配
}
};
这与之前的一个例题有类似的地方,可是那里的星号是代表了前缀字符,而这里的星号可能代表随意字符数量。
这里的回退与KMP有类似的地方,两者是否能比較融合呢?下次再看到这里的时候要做下比較。
每日算法之三十五:Wildcard Matching的更多相关文章
- 每日算法之三十四:Multiply Strings
大数相乘,分别都是用字符串表示的两个大数.求相乘之后的结果表示. 首先我们应该考虑一下測试用例会有哪些,先准备測试用例对防御性编程会有比較大的帮助.可以考虑一些极端情况.有以下几种用例: 1)&quo ...
- 每日算法之三十八:Anagrams
Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...
- Java数据结构和算法(十五)——无权无向图
前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做“树”是因为它看起来像一棵倒挂的树,包括二叉树.红黑树.2-3-4树.堆等各种不同的 ...
- python数据结构与算法第十五天【二叉树】
1.树的特点 (1)每个节点有零个或多个子节点: (2)没有父节点的节点称为根节点: (3)每一个非根节点有且只有一个父节点: (4)除了根节点外,每个子节点可以分为多个不相交的子树: 2.树的种类 ...
- OpenCV-Python 交互式前景提取使用GrabCut算法 | 三十五
目标 在本章中, 我们将看到GrabCut算法来提取图像中的前景 我们将为此创建一个交互式应用程序. 理论 GrabCut算法由英国微软研究院的Carsten Rother,Vladimir Kolm ...
- 每日算法之三十三:Trapping Rain Water
这是一个非常有意思的问题,求解最大容积问题,值得动脑筋想一想. 原题例如以下: Given n non-negative integers representing an elevation map ...
- [置顶] LLVM每日谈之十五 LLVM自带的examples
作者:snsn1984 在LLVM源码的目录下,有一个目录叫做examples,这个目录下边有几个LLVM的例子,初学者一般不会太关注这些例子,但是这些例子确实是精华中的精华,在LLVM的学习过程中不 ...
- Java经典编程题50道之三十五
有一个数组,将其最大的元素与第一个元素交换,最小的元素与最后一个元素交换,然后输出数组. public class Example35 { public static void main(Str ...
- ABP框架系列之三十五:(MVC-Controllers-MVC控制器)
Introduction ASP.NET Boilerplate is integrated to ASP.NET MVC Controllers via Abp.Web.Mvc nuget pack ...
随机推荐
- SQL Server 删除数据库所有表和所有存储过程
场景: SQL Server中,需要删除所有表或所有存储过程时,手动的方式只能逐个进行删除,耗个人时间,所以想弄个语句来实现这样的需求. 如果由于外键约束删除table失败,则先删除所有约束: - ...
- storm深入研究
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:He Ransom链接:http://www.zhihu.com/question/23441639/answer/28075 ...
- ftp命令行工具如何 连接 非标准21端口(其他端口)的ftp服务器
windows: step1:ftp命令进入ftp交互环境 step2:ftp>open ip空格port 然后...
- 如何POST一个JSON格式的数据给Restful服务
在Android/java平台上实现POST一个json数据: JSONObject jsonObj = new JSONObject(); jsonObj.put("username&qu ...
- MVC 5 视图之公用代码
一.公共模板 1.@RenderBody() 在网站公用部分通过一个占位符@RenderBody()来为网站独立部分预留一个位置.然后私有页面顶部通过@{Layout="公用模板路径&quo ...
- oracle数据备份
from:http://www.docin.com/p-728428621.html
- Java精选笔记_集合【Set(集合)接口】
Set(集合)接口 简介 同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了. ...
- CentOS6.5安装图形界面(Gnome)
因为是以最小化安装的Linux,无法使用图形界面,从网上看到资料,我使用yum安装果然很简单 ----------------------------------------------------- ...
- 使用fetch-jsonp进行跨域以及参数的传递
其实fetch-jsonp的官方文档里面已经写得很详细了,连接如下:https://github.com/camsong/fetch-jsonp:但是由于它本身没有多少demo,所以自己在上手的时候遇 ...
- 【Android N 7.1.1】 屏幕亮和灭的处理地方
frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java private vo ...