☆打卡算法☆LeetCode 44、通配符匹配 算法解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: “给定一个字符串和一个字符模式,实现一个通配符匹配。”

一、题目


1、算法题目

“给定一个字符串和一个字符模式,实现一个通配符匹配。”

题目链接:

来源:力扣(LeetCode)

链接:44. 通配符匹配 - 力扣(LeetCode) (leetcode-cn.com)


2、题目描述

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

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

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

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
复制代码
示例 2:
输入:
s = "aa"
p = "*"
输出: true
解释: '*' 可以匹配任意字符串。
复制代码


二、解题


1、思路分析

这个题跟正则表达式匹配还是很像的,但是相对而已本题还是简单一些。

首先,模式p中任意字符都是独立的,不会与其他字符相互关联,比说说小写字母a-z都是匹配一个小写字母,问号?可以匹配任意一个小写字母,但是星号* 的匹配是不确定的,需要枚举所有的匹配情况。

为了减少重复枚举,我们可以使用双指针来解决本题。


2、代码实现

代码参考:

public class Solution {
    public bool IsMatch(string s, string p) {
        int i = 0;//指向字符串s
        int j = 0;//指向字符串p
        int startPos = -1;//记录星号的位置
        int match = -1;//用于匹配星号
        while(i < s.Length){
            //表示相同或者p中为?
            if(j < p.Length && (s[i] == p[j] || p[j] == '?')){
                i++;
                j++;
            }
            //匹配到了星号,记录下的位置
            else if(j < p.Length && p[j] == '*'){
                startPos = j;
                match = i;
                j = startPos + 1;
            }
            //以上都没有匹配到,回到星号所在的位置,往后再次匹配
            else if(startPos != -1){
                match++;
                i = match;
                j = startPos + 1;                
            }
            else{
                return false;
            }
        }
        //去除多余的星号
        while(j < p.Length && p[j] == '*')j++;
        return j==p.Length;
    }
}
复制代码

网络异常,图片无法展示
|


3、时间复杂度

时间复杂度 : O(mn)

其中m和n分别是字符串和模式的长度。

空间复杂度: O(mn)

只需要存储所有m+n个状态需要的空间。


三、总结

忘了正则表达式匹配是怎么做的,可以返回去看一下# ☆打卡算法☆LeetCode 10、实现正则表达式匹配 算法解析

当然,想算法很爽,写算法很难受,这就叫做思想的巨人,行动的矮人嘛。。



相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
17天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
27 2
|
3月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
70 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
3月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
70 2
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
61 1
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
70 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0
下一篇
无影云桌面