zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    第三次作业——for 语句及分支结构else-if
    第二次作业及总结——数据类型和运算符
    .net webapi 过滤器使用(异常日志)
    .net webapi 过滤器使用(记录访问日志)
    how to get state when push notification
    Qt项目下pro文件设置库路径
    配置安装oh-my-bash
    03、工具篇--Maven
    04、JavaEE--SSH整合
    01、JavaEE--Hibernate
  • 原文地址:https://www.cnblogs.com/bonelee/p/14289563.html
Copyright © 2011-2022 走看看