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
时间 O(N) 空间 O(1)
假设我们用两个指针分别指向s和p字符串中要匹配的位置,首先分析下通配符匹配过程中会有哪些情况是成功:
s的字符和p的字符相等
p中的字符是?
,这时无论s的字符是什么都可以匹配一个
p中遇到了一个*
,这时无论s的字符是什么都没关系
之前的都不符合,但是p在之前的位置有一个*
,我们可以从上一个*
后面开始匹配 (例:s=ab,p=?*c,此时我们就要用b之后的字符去匹配c)
s已经匹配完,但是p后面还有很多连续的`*.
具体算法如下:
- 定义scur, pcur, sstar, pstar
- 如果*scur存在
- 如果*scur等于*pcur或者*pcur为 '?',则scur和pcur都自增1
- 如果*pcur为'*',则pstar指向pcur位置,pcur自增1,且sstar指向scur
- 如果pstar存在,则pcur指向pstar的下一个位置,scur指向sstar自增1后的位置
- 如果pcur为'*',则pcur自增1
- 若*pcur存在,返回False,若不存在,返回True
实现代码:
class Solution {
public:
bool isMatch(const char *s, const char *p) {
const char *scur = s, *pcur = p, *sstar = NULL, *pstar = NULL;
while (*scur)
{
if (*scur == *pcur || *pcur == '?')
{
++scur;
++pcur;
}
else
if (*pcur == '*')
{
pstar = pcur++;
sstar = scur;
}
else
if (pstar)
{
pcur = pstar + 1;
scur = ++sstar;
}
else
return false;
}
while (*pcur == '*') ++pcur; //如果s与p比较结束,p还有剩余的,一直遍历结束;
return !*pcur; //剩下的只能全为'*';
}
};
本文发布于:2024-01-31 16:40:57,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170669046029923.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |