• DFS和动态规划——字符串匹配 真蛋疼 为*的情况需考虑匹配0个、1个、2个情况 DFS会超时 正则匹配的话 需要向前看x*的情况 打包处理


    192. 通配符匹配

    中文
    English

    判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:

    • '?' 可以匹配任何单个字符。
    • '*' 可以匹配任意字符串(包括空字符串)。

    两个串完全匹配才算匹配成功。

    样例

    样例1

    输入:
    "aa"
    "a"
    输出: false
    

    输出2

    输入:
    "aa"
    "aa"
    输出: true
    

    输出3

    输入:
    "aaa"
    "aa"
    输出: false
    

    输出4

    输入:
    "aa"
    "*"
    输出: true
    说明: '*' 可以替换任何字符串
    

    输出5

    输入:
    "aa"
    "a*"
    输出: true
    

    样例6

    输入:
    "ab"
    "?*"
    输出: true
    说明: '?' -> 'a' '*' -> 'b'
    

    样例7

    class Solution:
        """
        @param s: A string 
        @param p: A string includes "?" and "*"
        @return: is Match?
        """
        def isMatch(self, s, p):
            # write your code here
            m,n = len(s),len(p)
            dp = [[False]*(n+1) for i in range(m+1)]
            
            dp[0][0] = True
            for i in range(1, m+1):
                dp[i][0] = False
            
            for j in range(1, n+1):
                dp[0][j] = dp[0][j-1] and p[j-1] == '*'
            
            for i in range(1, m+1):
                for j in range(1, n+1):
                    if p[j-1] == '*':
                        dp[i][j] = dp[i-1][j-1] or dp[i][j-1] or dp[i-1][j]
                    else:
                        dp[i][j] = dp[i-1][j-1] and (p[j-1] == '?' or p[j-1] == s[i-1])
                              
    
            return dp[m][n]
            
            
            """
            def dfs(s, i, p, j):
                if i == len(s) and j == len(p):
                    return True
                
                if i == len(s) and p[j:] == "*":
                    return True
                
                if i == len(s) or j == len(p):
                    return False
                
                if p[j] == '?':
                    return dfs(s, i+1, p, j+1)
                elif p[j] == '*':
                    return dfs(s, i, p, j+1) or dfs(s, i+1, p, j+1) or dfs(s, i+1, p, j) 
                else: 
                    if s[i] != p[j]:
                        return False
                    return dfs(s, i+1, p, j+1)
    
            return dfs(s, 0, p, 0)
            """
    

    154. 正则表达式匹配

    中文
    English

    实现支持'.''*'正则表达式匹配。

    '.'匹配任意一个字母。

    '*'匹配零个或者多个前面的元素。

    匹配应该覆盖整个输入字符串,而不仅仅是一部分。

    需要实现的函数是:bool isMatch(string s, string p)

    isMatch("aa","a") → false

    isMatch("aa","aa") → true

    isMatch("aaa","aa") → false

    isMatch("aa", "a*") → true

    isMatch("aa", ".*") → true

    isMatch("ab", ".*") → true

    isMatch("aab", "c*a*b") → true

    样例

    样例 1:

    输入:"aa","a"
    输出:false
    解释:
    无法匹配
    

    样例 2:

    输入:"aa","a*"
    输出:true
    解释:
    '*' 可以重复 a
    

    class Solution:
        """
        @param s: A string
        @param p: A string includes "." and "*"
        @return: A boolean
        """
    
        def isMatch(self, s, p):
            # write your code here
            m, n = len(s), len(p)
            dp = [[False] * (n + 1) for i in range(m + 1)]
    
            dp[0][0] = True
            for i in range(1, m + 1):
                dp[i][0] = False
    
            for j in range(1, n + 1):
                if p[j - 1] == '*':
                    dp[0][j] = dp[0][j - 1]
                    continue
    
                if j < n and p[j - 1] != '*' and p[j] == '*':
                    dp[0][j] = dp[0][j - 1]
    
            for i in range(1, m + 1):
                for j in range(1, n + 1):
                    if p[j - 1] == '*':
                        dp[i][j] = dp[i][j - 1]
                        continue
    
                    if j < n and p[j] == '*':
                        if p[j-1] != '.' and p[j - 1] != s[i - 1]:
                            dp[i][j] = dp[i][j - 1]
                        else:
                            dp[i][j] = dp[i][j - 1] or dp[i - 1][j - 1] or dp[i - 1][j]
                    else:
                        dp[i][j] = dp[i - 1][j - 1] and (p[j - 1] == '.' or p[j - 1] == s[i - 1])
    
            return dp[m][n]
    
  • 相关阅读:
    Python_函数
    Python中元组,列表,字典的区别
    Oracle 在字符串中输入单引号或特殊字符
    Visual Studio Code管理MySQL
    Python .pyc的编译和反编译
    Django 模板变量之 forloop
    浅谈Django基础(HttpResponse、render、redirect)
    Django 使用form表单提交数据报错: Forbidden (403)
    Django出错提示TemplateDoesNotExist at /
    使用 vs code 创建 Django 项目
  • 原文地址:https://www.cnblogs.com/bonelee/p/14289563.html
Copyright © 2020-2023  润新知