https://leetcode.com/problems/wildcard-matching/
参考:http://www.cnblogs.com/zuoyuan/p/3781872.html
http://yucoding.blogspot.hk/2013/02/leetcode-question-123-wildcard-matching.html
用two pointers的方法.
这里概括的说就是如果在p中遇到star则用star 记录p中的star位置,并记录其对应的被匹配的s元素的位置为match,然后p_cur往前走一步而s_cur不往前走,因为可以匹配empty。然后如果s_cur和p_cur如果对应元素不相等,那么就看看star是否有值,有的话,那么p_cur退回到star + 1, 然后s_cur退回到match + 1, 并且这里match还要自己加1,相当于暂时认为star位置上的’‘匹配了其原来match上的元素,然后继续p_cur和s_cur往前进。
用s = ‘sbbc’ p = ‘*abd’来举例
For each element in s
If *s==*p or *p == ? which means this is a match, then goes to next element s++ p++.
If p==’‘, this is also a match, but one or many chars may be available, so let us save this ’s position and the matched s position.
If not match, then we check if there is a * previously showed up,
if there is no *, return false;
if there is an , we set current p to the next element of (*的下一个element), and set current s to the next saved s position (save s position的下一个element).
e.g.
abed
?b*d**
a=?, go on, b=b, go on,
e=, save position star=3, save s position ss = 3, p++
e!=d, check if there was a *, yes, ss++, s=ss; p=star+1
d=d, go on, meet the end.
check the rest element in p, if all are *, true, else false;
class Solution:
# @param s, an input string
# @param p, a pattern string
# @return a boolean
def isMatch(self, s, p):
s_cur = 0;
p_cur= 0;
match = 0;
star = -1;
while s_cur<len(s):#p比s短没关系,如果p只有一个*,那么
if p_cur< len(p) and (s[s_cur]==p[p_cur] or p[p_cur]=='?'):
s_cur = s_cur + 1
p_cur = p_cur + 1
elif p_cur<len(p) and p[p_cur]=='*':
match = s_cur#被*match的position
star = p_cur#*的position,如果有很多*,那么只save最近的那个
p_cur = p_cur+1#这里s_cur不变的原因是,*可以包括empty
elif (star!=-1):
p_cur = star+1
match = match+1#这里一定要注意match也要自己增加1,相当于star和match已经匹配成功了
s_cur = match
else:
return False
while p_cur<len(p) and p[p_cur]=='*':
p_cur = p_cur+1
if p_cur==len(p):
return True
else:
return False
自己重写code
容易忘记while条件是什么,这里是ps < len(s),因为是匹配s的letter,所以要把s scan完. 但是pp要往前进的时候,也要判断是否越界即pp < len(p).
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
if len(p) == 0 and len(s) != 0: return False
if len(p) == 0 and len(s) == 0: return True
ps, pp = 0, 0
star, match = -1, 0
while ps < len(s):
if pp < len(p) and (s[ps] == p[pp] or p[pp] == '?'):
ps += 1
pp += 1
elif pp < len(p) and p[pp] == '*':
star = pp
match = ps
pp += 1
elif star != -1:
pp = star + 1
match += 1
ps = match
else:
return False
while pp < len(p) and p[pp] == '*':
pp += 1
if pp == len(p):
return True
else:
return False