您的位置:首页 > 其它

[Leetcode] 44. Wildcard Matching

2017-08-27 16:02 363 查看
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).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false


         

动态规划。假设dp[i][j]表示的是s[0...i-1]和p[0...j-1]的匹配状况(true or false),那么状态转移方程如下:

1) dp[i][j] = d[i-1][j-1] or dp[i][j-1] or dp[i-1][j]            (if p[j-1] == '*')            '*'匹配了1或0或n个字符
2) dp[i][j] = d[i-1][j-1]                                                (if p[i-1] == '?')            '?'匹配了一个字符s[i-1]
3) dp[i][j] = d[i-1][j-1] and s[i-1] == p[j-1]

边界条件是:
dp[0][0] = True
dp[i][0] = False
dp[0][j] = dp[0][j-1] if p[j-1] == '*'

code:
class Solution:
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
sl = len(s)
pl = len(p)

dp = [[False for j in range(pl+1)] for i in range(sl+1)]
dp[0][0] = True

for j in range(1,pl+1):
if p[j-1] == '*':
dp[0][j] = dp[0][j-1]

for i in range(1,sl+1):
for j in range(1,pl+1):
if p[j-1] == '*':
dp[i][j] = dp[i][j-1] or dp[i-1][j-1] or dp[i-1][j]
elif p[j-1] == '?':
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = dp[i-1][j-1] and s[i-1] == p[j-1]
return dp[sl][pl]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 string