每日算法之三十五:Wildcard Matching
来源:互联网 发布:java object对象 编辑:程序博客网 时间:2024/06/10 10:20
模式匹配的实现,'?'代表单一字符,'*'代表任意多的字符,写代码实现两个字符串是否匹配。
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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "*") → trueisMatch("aa", "a*") → trueisMatch("ab", "?*") → trueisMatch("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有相似的地方,两者能否比较融合呢?下次再看到这里的时候要做下比较。
0 0
- 每日算法之三十五:Wildcard Matching
- LeetCode之Wildcard Matching
- 算法学习之动态规划(leetcode 44 Wildcard Matching)
- 每日算法之九:Regular Expression Matching
- LeetCode算法题目: Wildcard Matching
- 【算法】【Dynamic Programming】Wildcard Matching
- 【leetcode 44】 Wildcard Matching 【正确算法】
- 算法分析课每周练习 Wildcard Matching
- LeetCode算法题——Wildcard Matching
- 算法练习(17):Wildcard Matching
- (算法分析Week9)Wildcard Matching[Hard]
- 算法第15周Wildcard Matching[hard]
- Wildcard Matching
- Wildcard Matching
- Wildcard Matching
- Wildcard Matching
- Wildcard Matching
- Wildcard Matching
- I2C总线在Linux系统中的驱动设计
- 设计模式六大原则(1):单一职责原则
- web编程中的汉字乱码问题
- 联播大业王恒:风险控制是制胜根本
- Java虚拟机学习
- 每日算法之三十五:Wildcard Matching
- 有关邮件系统的三种协议smtp,pop3,imap
- 割点、割边
- 解析json中的JSONArray中元素的解析
- 联播大业王恒:炒股要有三种境界
- YII学习初级
- iOS 7毛玻璃模糊效果
- vc++加载透明png图片的两种方法-GDI+和CImage
- 对《JCP》"3.4.2"的理解