【题目描述】
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()]的值就可以判定s和p是否能够匹配。
【参考答案】
Lintcode192 Wildcard Matching solution 题解
最新推荐文章于 2020-10-16 09:23:20 发布