zoukankan      html  css  js  c++  java
  • Wildcard Matching

    问题:给定两个字符串s和p,s是小写字母组成的字符串,p中除了小写字母外,还可能有“?”和“*”。判断按照正则表达式的规则,p能否和s匹配成功。("?"匹配任意单个字符,"*"匹配多个任意字符,包括空字符)

    示例:

    输入:s = "bb" p = "b"

    输出:False

    输入:s = "ab" p = "*"

    输出:True

    输入:s = "dr" p = "r?"

    输出:False

    输入:s = "abcde" p = "a*c* 

    输出:True

    解决思路:

    # 根据p和s是否为空进行判断,为空输出相应的结果
    # s和p都不为空,从两端逐个判断p的单个子字符是否等于s的单个子字符或者是否为“?”和“*”,如果相等或者为“?”,则缩短两者
    # 再次判断p和s是否为空
    # 当p和s都不为空,p的两端如果不是*,则返回False,如果是“*”,使用“*”分割p,再进一步判断子字符串是否依次在s中出现,注意“?”也是满足条件的

    Python代码:

    class Solution(object):
        def isMatch(self, s, p):
            """
            :type s: str
            :type p: str
            :rtype: bool
            """
            if not p:
                return not s
            if not s:
                return p == len(p)*"*"
            
            i = 0
            while i < len(p) and i < len(s):
                if p[i] in [s[i],"?"]:
                    i += 1
                else:
                    break    
            p = p[i:]
            s = s[i:]
            
            j = len(p)-1
            k = len(s)-1
            while j >= 0 and k >= 0:
                if p[j] in[s[k],"?"]:
                    j -= 1
                    k -= 1
                else:
                    break       
            p = p[:j+1]
            s = s[:k+1]
            
            if not p:
                return not s
            if not s:
                return p == len(p)*"*"
            
            if p[0] != "*" or p[-1] != "*":
                return False
            else:
                lp = p.split("*")
                for sub in lp:
                    if sub:
                        flag = False
                        for j in range(len(s)-len(sub)+1):
                            if sub[0] in [s[j],"?"]:
                                if self.Match(s[j:j+len(sub)],sub):
                                    flag = True
                                    s = s[j+len(sub):]
                                    break
                        if not flag:
                            return False
                return True
                        
        def Match(self,a,b):
            for i in range(len(a)):
                if b[i]  not in [a[i],"?"]:
                    return False
            return True
  • 相关阅读:
    异步编程与scrapy
    统计学 李航读书笔记
    算法模型手写
    《剑指offer》面试题的Python实现
    numpy 中文手册
    django部署
    Django ORM中使用update_or_create功能再解
    RabbitMQ(七)心跳控制 -- heartbeat
    重写__eq__函数——对象list中使用in index()——获得list中不同属性对象个数
    Python机器学习及分析工具:Scikit-learn篇
  • 原文地址:https://www.cnblogs.com/wenqinchao/p/10838215.html
Copyright © 2011-2022 走看看