【題目描述】函數
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是否可以匹配。
【參考答案】