博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode】44. Wildcard Matching (2 solutions)
阅读量:7231 次
发布时间:2019-06-29

本文共 3501 字,大约阅读时间需要 11 分钟。

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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "*") → trueisMatch("aa", "a*") → trueisMatch("ab", "?*") → trueisMatch("aab", "c*a*b") → false

 

解法一:

这题想法参考了,

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

主要思想如下:

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

当后续匹配过程中出错,采用回溯的方法,假设*匹配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 all                return 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 s p = starpos + 1; s = spos + 1; spos ++; //let '*' matches one more chars in s } else //*s is too long return 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 match else if(starpos != NULL) {
//maybe '*' matches too few chars in s p = starpos + 1; s = spos + 1; spos ++; //let '*' matches one more chars in s } else //not match return false; } } }};

 

解法二:

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

当*数目太多时会超时。

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 s            if(isMatch(s, p+1))                return true;                            //case2: try all possible numbers            while(*s != 0)            {                s ++;                if(isMatch(s, p+1))                    return true;            }            return false;        }        else        {            if((*s==*p) || (*p=='?'))                return isMatch(s+1, p+1);            else                return 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;}

 

转载地址:http://wwpfm.baihongyu.com/

你可能感兴趣的文章
ASP.NET MVC中使用FluentValidation验证实体
查看>>
usb mass storage device
查看>>
CentOs7
查看>>
python3封装Api接口
查看>>
jar包双击执行引用外部包问题
查看>>
OI复习计划
查看>>
about
查看>>
O-Bomb(数位dp)
查看>>
hdu5032 点和查询分别按极角排序 离线做+树状数组
查看>>
hdu1428 递归形式dp(记忆化搜素):A能到B的条件是A到目的地最短路大于B到目的地最短路...
查看>>
实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)...
查看>>
关于VC++6.0 MFC项目运行所需的动态链接库
查看>>
由system.currentTimeMillis() 获得当前的时间
查看>>
复习日记-Linux项目发布
查看>>
The 'Microsoft Jet OLEDB 4.0 Provider' is not registered on the local machine
查看>>
Java 基础源码 switch语句判断指定月份属于一年中的哪个季度
查看>>
12px以下字体显示问题
查看>>
小程序滚动条 无法滚动BUG 解决方案
查看>>
cs108 04 oop design
查看>>
win7 打开方式不能添加程序
查看>>