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';
}
};