每日算法之三十五: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 ...
随机推荐
- MongoDB基础入门视频教程
MongoDB基础入门视频教程http://www.icoolxue.com/album/show/98
- web api post/put空值问题以及和angular的冲突的解决
先看web api自己的问题 即便你新建一个项目,也会看到示例的values控制器有两个接受[FromBody]String参数的put和post方法,请求的时候发现不能从request里面得到想要的 ...
- JavaScript 取对象的值时用点和中括号的区别
用点的时候 点后面是对象的真实属性名称, 用中括号的时候 中括号里面是变量或者字符串
- Oracle中给用户赋予debug权限
通过可视化工具(如PL/SQL Developer.Oracle SQL Developer)调试Oracle的存储过程时,如果遇到如下错误信息:...ORA-01031: insufficient ...
- 怎样设置table中td的高度为1px
在制作edm时会遇到须要设置td的高度为1px,假设td标签中有 时不管你怎么设置td的高度都没用,最小高度都是18px. 这时须要把表格中的 去掉.例: 原来是这种: <tr> < ...
- Android ListView圆角
首先来看看ListView 相关基本属性 1.单击列表后,列表的背景变成黑色了. 可通过指定android:cacheColorHint的属性来放变它,将它指定为透明. 使用以下的属性值: a ...
- PHP-002
PHP URL重写 怎样在IIS环境下配置Rewrite规则_百度经验 http://jingyan.baidu.com/article/c33e3f485a7c74ea15cbb50e.html W ...
- C语言之顺序结构
该章内容:这章我们学习三大结构之一:顺序结构,它是程序从上往下顺序执行,是程序运行最简单的方式.printf和scanf函数使用和特例是必考知识.本章是考试的重点章节. 学习方法:从简单的顺序结构题目 ...
- MUI ajax数据请求(list)
服务器返回格式 { "code": "1001", "message": "查询成功", "data" ...
- cache buffers chains以及热块解决方案
cache buffers chains以及热块解决方案 今天是2013-10-10,今天下午我调休了,中午饭过后从14点一直睡到16点,这种感觉真爽. 之前学习过关于buffer cache的ca ...