首页 > 其他分享 >Leetcode 044. 通配符匹配

Leetcode 044. 通配符匹配

时间:2023-12-20 11:48:02浏览次数:34  
标签:aa 字符 匹配 示例 通配符 044 Leetcode dp size

https://leetcode.cn/problems/wildcard-matching/description/

给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?' 和 '*' 匹配规则的通配符匹配:
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符序列(包括空字符序列)。
判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

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

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

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

提示:
0 <= s.length, p.length <= 2000
s 仅由小写英文字母组成
p 仅由小写英文字母、'?' 或 '*' 组成

解答
使用dp动态规划解决该题
dp[x][y] 表示 s[1~x] 与p[1~y] 是否匹配
那么有一下4种情况
1 p[y]是字母 且和s[x]相同 dp[x][y]=dp[x-1][y-1];
2 p[y]是字母但是和s[x]不相同
那么dp[x][y] =false(也就是0);
3 p[y]是?,那么无条件匹配 dp[x][y]=dp[x-1][y-1];
4 p[y]是,那么替代0个字符 dp[x][y]= dp[x][y-1]
替代多个字符 因为p[y]是, 任意dp[x-2][y],dp[x-3][y],dp[x-4][y]...为真,均可以推导出dp[x-1][y]为真,
所以我们只有一个转移方程 dp[x][y] = dp[x-1][y]

class Solution {
public:
    bool isMatch(string s, string p) {
        vector<vector<int>> dp(s.size()+5, vector<int>(p.size()+5));
        dp[0][0] = 1;
        s.insert(s.begin(), '#');
        p.insert(p.begin(), '#');

        for (int i = 0; i < s.size(); i++) {
            for (int j = 0; j < p.size(); j++) {
                if (s[i] == p[j] || p[j] == '?') {
                    if (i >= 1 && j >= 1)
                        dp[i][j] |= dp[i - 1][j - 1];
                }
                else if (p[j] == '*') {
                    if (i >= 1)
                        dp[i][j] |= dp[i - 1][j];
                    if (j >= 1)
                        dp[i][j] |= dp[i][j - 1];
                    //if (i >= 1 && j >= 1)
                        //dp[i][j] |= dp[i - 1][j - 1];
                }
            }
        }
        //cout << dp[s.size() - 1][p.size() - 1] << endl;

        return dp[s.size() - 1][p.size() - 1];
    }
};

视频题解空间

标签:aa,字符,匹配,示例,通配符,044,Leetcode,dp,size
From: https://www.cnblogs.com/itdef/p/17916164.html

相关文章

  • [LeetCode] LeetCode704. 二分查找
    题目描述思路基础二分查找模板的考察。方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,right=nums.length-1;while(left<=right){......
  • [LeetCode Hot 100] LeetCode33. 搜索旋转排序数组
    题目描述思路如果nums[left]<=nums[mid],则[left,mid]有序如果nums[left]>nums[mid],则[mid,right]有序方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,ri......
  • [LeetCode Hot 100] LeetCode35. 搜索插入位置
    题目描述思路基础二分搜索模板本质:找到第一个大于等于target的元素的下标注意:该题目不存在重复元素存在一种特殊情况:target>nums的最大值,此时插入的位置正好是left的位置方法一:classSolution{publicintsearchInsert(int[]nums,inttarget){if......
  • [LeetCode Hot 100] LeetCode34.在排序数组中查找元素的第一个和最后一个位置
    题目描述思路:二分查找之寻找左右侧边界两个关键点:1.数组有序;2.时间复杂度O(logn)方法一:classSolution{publicint[]searchRange(int[]nums,inttarget){if(nums.length==0||nums==null){returnnewint[]{-1,-1};}......
  • #yyds干货盘点# LeetCode程序员面试金典:有序矩阵中第 K 小的元素
    题目给你一个nxn矩阵matrix,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个不同的元素。你必须找到一个内存复杂度优于O(n2)的解决方案。 示例1:输入:matrix=[[1,5,9],[10,11,13],[12,13,15]],k=8输......
  • 代码随想录算法训练营第四天| LeetCode24. 两两交换链表中的节点、19.删除链表的倒数
     LeetCode24.两两交换链表中的节点●今日学习的文章链接和视频链接代码随想录(programmercarl.com)题目链接24.两两交换链表中的节点-力扣(LeetCode)●自己看到题目的第一想法主要是把这个过程想清楚,链表交换的题目主要想明白要动几个指针,指针改变的顺序也要注意,如果......
  • 【LeetCode】2288. 价格减免
    一、题目描述句子是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号'$'。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个价格。例如"$100"、"$23"和"$6.75"表示价格,而"100"、"$"和"2$3"不是。注意:......
  • #yyds干货盘点# LeetCode程序员面试金典:组合总和 Ⅳ
    题目给你一个由不同整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合32位整数范围。 示例1:输入:nums=[1,2,3],target=4输出:7解释:所有可能的组合为:(1,1,1,1)(1,1,2)(1,2,1)......
  • #yyds干货盘点# LeetCode程序员面试金典:最长特殊序列 II
    题目给定字符串列表strs,返回其中最长的特殊序列的长度。如果最长特殊序列不存在,返回-1。特殊序列定义如下:该序列为某字符串独有的子序列(即不能是其他字符串的子序列)。s的子序列可以通过删去字符串s中的某些字符实现。例如,"abc"是"aebdc"的子序列,因为您可以删除......
  • [LeetCode] LeetCode373. 查找和最小的K对数字
    题目描述思路:大顶堆+翻转注意:该题有问题,代码可以通过测试用例。方法一:classSolution{publicList<List<Integer>>kSmallestPairs(int[]nums1,int[]nums2,intk){PriorityQueue<Node>heap=newPriorityQueue<>((e1,e2)->e2.sum-e1.sum);......