Lintcode192 Wildcard Matching solution 题解

 
 

【题目描述】

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).

判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:

'?' 可以匹配任何单个字符。

'*' 可以匹配任意字符串(包括空字符串)。

两个串完全匹配才算匹配成功。

函数接口如下: bool isMatch(const char *s, const char *p)

【题目链接】

www.lintcode.com/en/problem/wildcard-matching/

【题目解析】

本题的考察点为动态规划。

字符串的模板匹配,实质为字符串之间的比较。当我们比较s[i]和p[j]是否能够匹配时,可以通过s[0..i-1]与p[0..j-1]的匹配关系来推导。

如果我们已经知道s[0..i-1]和p[0..j-1]的匹配关系时,就可以很容易推导出s[0..i]和p[0..j]的匹配关系。其递推公式为:

当p[j]为*时,由于*可以考虑为0~n个任意字符,因此分为3种不同的情况:

s[i-1]和p[j-1]进行匹配,s[i]和p[j]进行匹配。此时考虑*表示1个字符。

s[i-1]已经和p[j]进行了匹配,s[i]也仍然和p[j]进行匹配。此时考虑*表示n个字符。

s[i]和p[j - 1]进行了匹配,此时考虑*表示0个字符。

当p[j]为?时:

s[i-1]和p[j-1]进行匹配,s[i]和p[j]进行匹配。

当p[j]为字母时:

s[i-1]和p[j-1]进行匹配,s[i]和p[j]进行匹配。

若我们使用f[i][j]表示s[0..i]和p[0..j]是否能够匹配,则上面的递推关系可以表示为:

f[i][j] = f[i-1][j-1] | f[i-1][j] | f[i][j - 1] (p[j] == '*')f[i][j] = f[i-1][j-1] (p[j] == '?')f[i][j] = f[i-1][j-1] && p[j] == s[i] (others)

需要注意的是边界条件:

f[i][0] = false;f[0][0] = true;

但是对于f[0][j]需要特殊处理,当p[j]为*,f[0][j]的值可以等于f[0][j-1],此时将*考虑为0个字符。

最后根据f[s.size()][p.size()]的值就可以判定sp是否能够匹配。

【参考答案】

www.jiuzhang.com/solutions/wildcard-matching/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值