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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值