您的位置:首页 > 编程语言 > C语言/C++

[leetcode[ 【字符串】 44. Wildcard Matching

2016-06-14 23:59 423 查看
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


 

题意

实现?和*的通配符模式匹配

?可以替换任意单字符

*可以匹配任意字符序列,包括空序列

通配符正好可以匹配输入字符串

题解

难度在于*可以匹配一段字符串,所以如果p中包含有*,则做一个标记,把s中与p的*后面的字符不匹配的过滤掉

所以根据*p分三种情况:     *p是?时   s和p都接着往下遍历

*p是*时,做一个标记,表示*p前有*;     同时记录*的位置和当前s的位置

*p是其他字符时,如果前边没有*并且当前字符不匹配,则返回错误 ;   如果前边有*,p要筛选s(筛选的过程是这样,*后面的字符与s的进行逐一匹配,如果匹配失败,则过滤掉一个s)

class Solution {
public:
bool isMatch(string s, string p) {
bool start=false;
const char *scur,*pcur,*ss,*pp;
for(scur=&s[0],pcur=&p[0];*scur!='\0';scur++,pcur++)
{
switch(*pcur)
{
case '?':
break;
case '*':
start=true;
ss=scur;
pp=pcur;
while(*pp=='*') pp++;//连续的*是一样的效果
if(*pp=='\0') return true;
scur=ss-1;//相当于下一轮s的位置不变
pcur=pp-1;//把下一轮的p置于*的后面
break;
default :
if(*pcur!=*scur)
{
if(!start) return false;
ss++;
scur=ss-1;//s往前遍历,p保持在*后面
pcur=pp-1;
}
break;
}
}
while(*pcur=='*') pcur++;
return *pcur=='\0';
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode cpp