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/

相關文章
相關標籤/搜索