leetcode -- Wildcard Matching --再看

来源:互联网 发布:黑马协议软件微信站街 编辑:程序博客网 时间:2024/06/06 16:45

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
0 0