分析:

  • * 能够匹配随意个字符,包含0个
  • 多个连续的*的作用相当于1个*。
  • * 后无其它字符。则直接匹配
  • 出现*p为 *,而*s为字符时。我们有两种选择,一种是跳过*p指示的*。也就是令*匹配0个字符,继续向后匹配。
  • 一种是我们须要用* 匹配多个字符,才干完毕匹配。
  • * 后有其它字符,则在s串中向后找与该非*字符匹配的字符,若没找到,则不匹配,若找到了。则会有不同的情况。
    1. 用s中首次遇到的与p中*后的非*字符匹配

                    这当然是好的,再看还有一种情况。
             2.不能用S 中首次遇到的与p中*后的非*字符与之匹配。
                   
                 如图所看到的。用s首次的e与p中的e匹配后,继续匹配的过程中发生了不匹配,但事实上s串和p是匹配的,这就是说,要继续扩大 * 的作用域,将e也与* 进行匹配。
                                    
 可是通过前面的情况,我们发现p和s都跑了,p指向了g。s指向了第二个e。所以要记录下*后面的非*字符的位置。以便在兴许发生不匹配时,又一次进行匹配。 

实现:

 bool isMatch(const char *s, const char *p) {  const char *backtrack_s = NULL;const char *backtrack_p = NULL;  while (*s) {  //match if (*p == '?

' || *s == *p) { ++s; ++p; } //don't match. else { //meet * if (*p == '*') { //skip multiply *. while (*p == '*') ++p; if (*p == '\0') return true; //record the next position of *. backtrack_s = s; backtrack_p = p; } // else {//注意:推断前面是否出现了* if (backtrack_p) { //注意:在当前位置往后推断出现不相等的时候,再又一次回到下一个位置又一次往后比較 //其意义是继续扩大*的作用范围。

s = ++backtrack_s; p = backtrack_p;//恢复p的位置 } //既不匹配。前面又没有*,这就是真的不匹配了。 else return false; } } } //end while while (*p == '*')//处理p末端的* ++p; return (*s == '\0' && *p == '\0'); }

转载于:https://www.cnblogs.com/zfyouxi/p/5287503.html

【leetcode】Wildcard Matching相关推荐

  1. 【LeetCode】字符串 string(共112题)

    [3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...

  2. 【To Understand! 重点 递归 动态规划 正则表达式匹配】LeetCode 44. Wildcard Matching

    LeetCode 44. Wildcard Matching Solution1:我的答案 递归,时间复杂度是O(2n)O(2n)O(2^n)因为超时未能AC 只是记录一下,以警示后人-- class ...

  3. 【Leetcode】100. 相同的树

    题目 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1/ \ / \2 3 2 3[1,2,3], [1 ...

  4. 【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵

    1. 题目 Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  5. 【leetcode】486. Predict the Winner

    题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...

  6. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  7. 【leetcode】86. Partition List

    题目如下: Given a linked list and a value x, partition it such that all nodes less than x come before no ...

  8. 【Leetcode】103. 二叉树的锯齿形层次遍历

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...

  9. 【Leetcode】79.单词搜索

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  10. 【leetcode】 算法题1 两数之和

    [leetcode] 算法题1 两数之和 问题   给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...

最新文章

  1. 我对于js注入的理解
  2. LSGO软件技术团队招新
  3. 身份证校验程序(上)- 零基础入门学习Delphi48
  4. linux shell 和 golang 查询服务器硬件信息
  5. 【哲学】自由意志是什么?(主观能动性)
  6. 计算机基础课程在线教学授课方案,《计算机基础》课程分层次模块化教学实施方案...
  7. js微信小程序页面左上角返回跳转指定页面
  8. 小程序的点赞功能能和浏览次数功能_扫码点餐小程序好用吗?小程序还能实现哪些功能?...
  9. sed 执行错误:sed: 1: “…”: Invalid command code f
  10. lwip-1.4.1文档rawapi中文翻译
  11. sql脚本比较大,sqlserver 无法导入,就用cmd命令执行
  12. ajax iframe的使用方法,使用jQuery和ajax代替iframe的方法(详解)
  13. 合宙 4G模块Air720D Mini PCI-E 开发教程
  14. 联想微型计算机装Win10,联想小新 潮5000重装win10系统教程
  15. 腾云忆想技术干货|TSF微服务治理实战系列(一)——治理蓝图
  16. 已解决raise JSONDecodeError(“Expecting value”, s, err.value) from None
  17. Android项目小结——硬解码(MediaCodec实现[MP4]转YUV420各种格式)
  18. 互联网摸鱼日报(2023-01-21)
  19. html与css游戏开发工具,html/css/js开发者必备的10款最佳工具
  20. 小故事——巴比奇和他的计算机

热门文章

  1. Nginx源码阅读 --- http模块 --- TCP连接过程
  2. Zookeeper C API 指南四(C API 概览)
  3. bgsave配置与工作流程
  4. JavaScript数据类型之Number
  5. JAVA怎么出现10行10列的星号_C语言输出n行n列星号
  6. while循环python的范围_为什么Python中的range()循环比使用while循环更快?
  7. 网易云音乐html代码_网易云音乐歌单列表导出方法!
  8. 2.3创建用户访问过滤器(安全性)
  9. 几个好用的makefile 几乎可以不用修改
  10. Django之forms组件使用