【题目描述】
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是否能够匹配。
【参考答案】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。