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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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]

 

posted @   bonelee  阅读(111)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2018-01-17 DNS 隐蔽通道工具资料汇总
2017-01-17 mongodb停止遇到shutdownServer failed: unauthorized: this command must run from localhost when running db without auth解决方法
2017-01-17 mongodb集群——配置服务器放分片meta信息,说明meta里包含了哪些数据信息
点击右上角即可分享
微信分享提示