LeetCode 44 Wildcard Matching
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
if len(s) == 0:
for ch in p:
if ch != '*':
return False
return True
f = [[False] * (len(p)+1) for x in xrange(len(s)+1)]
f[0][0] = True
for i in xrange(0, len(s) + 1):
for j in xrange(1, len(p) + 1):
if p[j-1] == s[i-1] or p[j-1] == '?':
f[i][j] = f[i-1][j-1]
elif p[j-1] == '*':
for k in xrange(0, i+1):
if f[k][j-1]:
f[i][j] = True
break
#print f
return f[len(s)][len(p)]
第一个思路是f[i][j]
表示s[i]
匹配到p[j]
能否实现,两重循环计算,遇到*还要再加一层循环来确定p前一位匹配到了哪里。提交之后TLE。
可以发现有两个可以优化的地方,第一个是f[i][j]
第二维只需要j-1,因此可以降成一维数组。第二个是当p[j]是*时,任意f[k][j]
(k<=i)为True都可以,不需要每个i都向前搜索一遍,而应该遇到f[k][j]
反过来填后面的f[i][j]
(i>=k)。
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
if len(s) == 0:
for ch in p:
if ch != '*':
return False
return True
f = [False] * (len(s)+1)
f[0] = True
for ch in p:
if ch != '*':
for i in xrange(len(s), 0, -1):
if s[i-1] == ch or ch == '?':
f[i] = f[i-1]
else:
f[i] = False
f[0] = False
else:
for i in xrange(len(s)):
if f[i]:
for j in xrange(i+1, len(s) + 1):
f[j] = True
break
return f[len(s)]
此时f[i]表示截止到当前ch,能否匹配到第i位。
comments powered by Disqus