Lintcode192 Wildcard Matching solution 题解

【题目描述】函数

Implement wildcard pattern matching with support for'?'and'*'.code

'?'Matches any single character.接口

'*'Matches any sequence of characters (including the empty sequence).字符串

The matching should cover the entire input string (not partial).get

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

'?' 能够匹配任何单个字符。string

'*' 能够匹配任意字符串(包括空字符串)。it

两个串彻底匹配才算匹配成功。io

函数接口以下: 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/

相关文章
相关标签/搜索