Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 44. 通配符匹配(DP)

LeetCode 44. 通配符匹配(DP)

作者头像
Michael阿明
发布于 2020-07-13 07:16:43
发布于 2020-07-13 07:16:43
63600
代码可运行
举报
运行总次数:0
代码可运行

1. 题目

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?''*' 的通配符匹配。

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ?*。

示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:
输入:
s = "aa"
p = "*"
输出: true
解释: '*' 可以匹配任意字符串。

示例 3:
输入:
s = "cb"
p = "?a"
输出: false
解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

示例 4:
输入:
s = "adceb"
p = "*a*b"
输出: true
解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".

示例 5:
输入:
s = "acdcb"
p = "a*c?b"
输出: false

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/wildcard-matching 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:LeetCode 10. 正则表达式匹配(递归/DP)

建议先看完第10题再来做本题就相当容易了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {	//C++
public:
    bool isMatch(string s, string p) {
        int m = s.size(), n = p.size(), i, j, k;
        vector<vector<int>> dp(m+1, vector<int>(n+1,0));
        dp[0][0] = true;
        for(i = 0; i <= m; ++i)
        {
            for(j = 1; j <= n; ++j)
            {
                if(p[j-1]=='*')
                {
                	for(k = i; k >= 0; --k)
                	{
                        dp[i][j] |= dp[k][j-1];//k=i时,*表示空串
                        if(dp[i][j])
                            break;//可以匹配,就不再找了
                    }
                }
                else
                {
                	if(match(s,p,i,j))
                		dp[i][j] |= dp[i-1][j-1];
                }
            }
        }
        return dp[m][n];
    }
    bool match(string& s, string& p, int i, int j)
    {
    	return i>0 && (s[i-1]==p[j-1] || p[j-1]=='?');
    }
};

1160 ms 27.8 MB

  • j 为 *,匹配多个,可以这么想 dp[i-1][j]匹配了,j的最后是*,还在乎多出来一个i
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size(), n = p.size(), i, j, k;
        vector<vector<int>> dp(m+1, vector<int>(n+1,0));
        dp[0][0] = true;
        for(i = 0; i <= m; ++i)
        {
            for(j = 1; j <= n; ++j)
            {
                if(p[j-1]=='*')
                {
                	dp[i][j] |= dp[i][j-1] | (i>0 ? dp[i-1][j] : false);
                    //            *匹配0个    *匹配多个(后面多加一个i)
                }
                else
                {
                	if(match(s,p,i,j))
                		dp[i][j] |= dp[i-1][j-1];
                }
            }
        }
        return dp[m][n];
    }
    bool match(string& s, string& p, int i, int j)
    {
    	return i>0 && (s[i-1]==p[j-1] || p[j-1]=='?');
    }
};

112 ms 27.9 MB

python3 解答

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        m, n = len(s), len(p)
        dp = [[0]*(n+1) for _ in range(m+1)]
        dp[0][0] = 1
        for i in range(m+1):
            for j in range(1,n+1):
                if p[j-1]=='*':
                    dp[i][j] |= dp[i][j-1] | (dp[i-1][j] if i>0 else 0)
                else:
                    if i>0 and (s[i-1]==p[j-1] or p[j-1]=='?'):
                        dp[i][j] |= dp[i-1][j-1]
        return True if dp[m][n] else False

1152 ms 21.8 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 10. 正则表达式匹配(递归/DP)
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
Michael阿明
2020/07/13
1.2K0
DP:两个数组的dp问题
2、如果我们的dp多开了一行一列,可以在字符串的前面多加上一个空格(s=“ ”+s),这样可以保证dp数组和字符串数组的下标映射关系是一一对应的,方便我们书写代码
小陈在拼命
2024/06/14
790
DP:两个数组的dp问题
leetcode 10 Regular Expression Matching(简单正则表达式匹配)
最近代码写的少了,而leetcode一直想做一个python,c/c++解题报告的专题,c/c++一直是我非常喜欢的,c语言编程练习的重要性体现在linux内核编程以及一些大公司算法上机的要求,python主要为了后序转型数据分析和机器学习,所以今天来做一个难度为hard 的简单正则表达式匹配。
流川疯
2019/01/17
1.2K0
【动态规划算法练习】day13
115. 不同的子序列 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。 题目数据保证答案符合 32 位带符号整数范围。
摘星
2023/10/15
1680
【动态规划算法练习】day13
面试题噩梦之一——LeetCode题目10:正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
二环宇少
2020/08/13
9550
LeetCode无数种解法的hard问题,10-正则表达式匹配
今天和大家继续来聊聊LeetCode,我们今天看的是LeetCode第10题——正则表达式匹配。
TechFlow-承志
2022/09/22
4520
LeetCode无数种解法的hard问题,10-正则表达式匹配
LeetCode 97. 交错字符串(DP)
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
Michael阿明
2020/07/13
3420
LeetCode 115. 不同的子序列(DP)
一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
Michael阿明
2021/02/19
3410
字符串正则匹配leetcode_动态规划100题
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
全栈程序员站长
2022/09/22
3610
010. 正则表达式匹配 | Leetcode题解
给定一个字符串( s ) 和一个字符模式( p )。实现支持 '.' 和 '*' 的正则表达式匹配。
苏南
2020/12/16
2990
010. 正则表达式匹配 | Leetcode题解
[LeetCode] Wildcard Matching 外卡匹配
Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character.
全栈程序员站长
2022/07/05
2190
leetcode 通配符匹配_匹配任意一个字符的通配符是
大家好,又见面了,我是你们的朋友全栈君。 给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。 ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符串(
全栈程序员站长
2022/09/22
3970
东哥手写正则通配符算法,结构清晰,包教包会!
正则表达式是一个非常强力的工具,本文就来具体看一看正则表达式的底层原理是什么。力扣第 10 题「正则表达式匹配」就要求我们实现一个简单的正则匹配算法,包括「.」通配符和「*」通配符。
labuladong
2021/09/23
6610
DP:回文串模型
(1)中心扩展算法(在字符串章节有介绍)时间复杂度O(N^2),空间复杂度O(1)
小陈在拼命
2024/06/10
1160
DP:回文串模型
【力扣算法03】之正则表达式匹配- python
首先, 创建一个二维数组dp,其中dp[i][j]表示字符串s的前i个字符与模式p的前j个字符是否匹配。 初始化dp[0][0]为True,因为空字符串与空模式是匹配的。 接下来, 需要填充数组dp的其他值。我们使用两个嵌套的循环来遍历字符串s和模式p的每个字符。 对于每个位置(i, j),我们考虑几种情况:
全栈若城
2024/02/29
1630
【力扣算法03】之正则表达式匹配- python
LeetCode 1216. 验证回文字符串 III(DP)
给出一个字符串 s 和一个整数 k,请你帮忙判断这个字符串是不是一个「K 回文」。
Michael阿明
2021/02/19
7390
LeetCode 1278. 分割回文串 III(区间DP)
时间复杂度 O ( n 3 + n 2 k ) − > O ( n 3 ) O(n^3+n^2k)->O(n^3) O(n3+n2k)−>O(n3) 28 ms 7 MB C++
Michael阿明
2021/02/19
5440
LeetCode 第 23 场双周赛(970/2044,前47.5%)
做出来了 1、3 两题,继续加油! 第二道字符串的题,又是看错题,以后要多读几遍题目,题目说要使用所有字符,我视而不见,去排列组合。。。 第四题,想到了贪心,又转到动态规划去做,没做出来。
Michael阿明
2020/07/13
3350
LeetCode 161. 相隔为 1 的编辑距离(DP/遍历)
1. 题目 给定两个字符串 s 和 t,判断他们的编辑距离是否为 1。 注意: 满足编辑距离等于 1 有三种可能的情形: 往 s 中插入一个字符得到 t 从 s 中删除一个字符得到 t 在 s 中替换一个字符得到 t 示例 1: 输入: s = "ab", t = "acb" 输出: true 解释: 可以将 'c' 插入字符串 s 来得到 t。 示例 2: 输入: s = "cab", t = "ad" 输出: false 解释: 无法通过 1 步操作使 s 变为 t。 示例 3: 输入: s =
Michael阿明
2020/07/13
8590
LeetCode-面试题19-正则表达式匹配
给你一个字符串s和一个字符规律p,请你来实现一个支持 '.'和'*'的正则表达式匹配。
benym
2022/07/14
2010
推荐阅读
相关推荐
LeetCode 10. 正则表达式匹配(递归/DP)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档