Ai
1 Star 2 Fork 5

LilithSangreal/LeetCode-Solutions

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
wildcard-matching.py 3.08 KB
一键复制 编辑 原始数据 按行查看 历史
kamyu 提交于 2019-01-11 01:27 +08:00 . Update wildcard-matching.py
# Time: O(m + n) ~ O(m * n)
# Space: O(1)
# iterative solution with greedy
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
count = 0 # used for complexity check
p_ptr, s_ptr, last_s_ptr, last_p_ptr = 0, 0, -1, -1
while s_ptr < len(s):
if p_ptr < len(p) and (s[s_ptr] == p[p_ptr] or p[p_ptr] == '?'):
s_ptr += 1
p_ptr += 1
elif p_ptr < len(p) and p[p_ptr] == '*':
p_ptr += 1
last_s_ptr = s_ptr
last_p_ptr = p_ptr
elif last_p_ptr != -1:
last_s_ptr += 1
s_ptr = last_s_ptr
p_ptr = last_p_ptr
else:
assert(count <= (len(p)+1) * (len(s)+1))
return False
count += 1 # used for complexity check
while p_ptr < len(p) and p[p_ptr] == '*':
p_ptr += 1
count += 1 # used for complexity check
assert(count <= (len(p)+1) * (len(s)+1))
return p_ptr == len(p)
# dp with rolling window
# Time: O(m * n)
# Space: O(n)
class Solution2(object):
# @return a boolean
def isMatch(self, s, p):
k = 2
result = [[False for j in xrange(len(p) + 1)] for i in xrange(k)]
result[0][0] = True
for i in xrange(1, len(p) + 1):
if p[i-1] == '*':
result[0][i] = result[0][i-1]
for i in xrange(1,len(s) + 1):
result[i % k][0] = False
for j in xrange(1, len(p) + 1):
if p[j-1] != '*':
result[i % k][j] = result[(i-1) % k][j-1] and (s[i-1] == p[j-1] or p[j-1] == '?')
else:
result[i % k][j] = result[i % k][j-1] or result[(i-1) % k][j]
return result[len(s) % k][len(p)]
# dp
# Time: O(m * n)
# Space: O(m * n)
class Solution3(object):
# @return a boolean
def isMatch(self, s, p):
result = [[False for j in xrange(len(p) + 1)] for i in xrange(len(s) + 1)]
result[0][0] = True
for i in xrange(1, len(p) + 1):
if p[i-1] == '*':
result[0][i] = result[0][i-1]
for i in xrange(1,len(s) + 1):
result[i][0] = False
for j in xrange(1, len(p) + 1):
if p[j-1] != '*':
result[i][j] = result[i-1][j-1] and (s[i-1] == p[j-1] or p[j-1] == '?')
else:
result[i][j] = result[i][j-1] or result[i-1][j]
return result[len(s)][len(p)]
# recursive, slowest, TLE
class Solution4(object):
# @return a boolean
def isMatch(self, s, p):
if not p or not s:
return not s and not p
if p[0] != '*':
if p[0] == s[0] or p[0] == '?':
return self.isMatch(s[1:], p[1:])
else:
return False
else:
while len(s) > 0:
if self.isMatch(s, p[1:]):
return True
s = s[1:]
return self.isMatch(s, p[1:])
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/LilithSangreal/LeetCode-Solutions.git
git@gitee.com:LilithSangreal/LeetCode-Solutions.git
LilithSangreal
LeetCode-Solutions
LeetCode-Solutions
master

搜索帮助