leetcode -- Wildcard Matching --再看

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

你可能感兴趣的:(LeetCode)