【题目描述】

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]进行匹配。

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

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

需要注意的是边界条件:

fi = false;f0 = true;

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

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

【参考答案】

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


果酱
0 声望0 粉丝