边工作边刷题:70天一遍leetcode: day 95
Wildcard Matching
要点:
- 基本code pattern是以待匹配string s为中心loop,一旦没有任何p的分支match,返回false。如果所有s匹配了,还要检查是不是p也exhausted,一种分支是剩下的p是’*’,这样也可以匹配。
- worst case: s: abcd, p: efgh? every *, it swallows all abcd. so it O(n^2)
错误点:
- star和ss:star对应的是’*’这点在pattern中的位置,ss对应的是在上次没有swallow的s点的位置。实际上是记录了可以restore的状态
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
i,j = 0,0
ss = -1
star = -1
while i<len(s):
if j<len(p) and (s[i]==p[j] or p[j]=='?'):
i+=1;j+=1
elif j<len(p) and p[j]=='*':
star=j; ss=i; j+=1
elif ss!=-1:
ss+=1; i=ss; j=star+1
else:
return False
while j<len(p) and p[j]=='*': j+=1
return j==len(p)