当前位置: 首页 > news >正文

[LeeCode]—Wildcard Matching 通配符匹配问题

Wildcard Matching

 

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false
本题和上一篇: [LeetCode]—Regular Expression Matching 正则匹配 特别类似。只是“*”匹配任意字符串,不依赖于其前一个值了。


结合上一篇 Regular Expression Matching 的方法,先用递归的方式进行:

在本题的测试中,超时了。本题对时间复杂度的要求更高了。

class Solution {  //递归
public:
    bool isMatch(const char *s, const char *p) {
         assert(s && p);
         if(*p=='\0') return *s=='\0';

          if(*p!='*'){
            if(*p==*s || *p=='?' && *s!='\0')
                return isMatch(s+1,p+1);
            else
                return false;  
          }else{
               while(*s!='\0'){
                if(isMatch(s,p+1))return true;
                s++;
            }
            return isMatch(s,p+1);
          }  
    }
};

继续学习了大牛的代码后(https://gitcafe.com/soulmachine/LeetCode)给出如下迭代法的高效代码:


主要思路:

      一次性遍历s到s结束,用p模式串来匹配,看能不能将p串都匹配完(p能不能到结尾)。能匹配完(如果p剩余的是‘* ’,也作为匹配完)则说明匹配上了;否则,不能匹配。(根据能否将模式串P匹配完,作为依据)

       如果p遇到非'*',二者还不匹配,只要前面‘*’出现过,那可以将s++(s进一步),p处(p不变)重新开始(不匹配的部分一笔勾销,视为上一个‘*’还在发挥作用[1]

       如果p遇到“*”,那么越过它,p++,p继续向下进一步,暂时不管它,后面如果不匹配了,它自然会发挥作用,见[1]

class Solution{         //迭代的方法
public:
    bool isMatch(const char *s,const char *p){
         assert(s && p);
         const char *str,*ptr;

         bool star=false;  //表示前面是否有*在匹配
         for(str=s,ptr=p;*str!='\0';str++,ptr++){
            switch(*ptr){
            case '?': break;
            case '*': 
                     star=true;
                     s=str,p=ptr;
                     while(*p=='*')p++;         //p停留在下一个非*处
                     if(p=='\0')return true;
                     str=s-1;                         //为了for自增后,依然保持当前位置
                     ptr=p-1;                         //为了for自增后,依然保持当前位置
                     break;
            default:
                    if(*ptr!=*str){
                      if(!star)return false;   //如果前面没有出现过‘*’,则匹配失败
                      //前面有*
                      s++;            //目标s可以向下移动一个
                      str=s-1;                        //为了for自增后,依然保持当前位置
                      ptr=p-1;                        //为了for自增后,依然保持当前位置
                    }                  
		  //当*ptr==*str 匹配后 ptr,str才会自增,导致s,p向前移动一个
                  } 
		while(*ptr=='*')ptr++;   //如果ptr剩余的值是*,那么视为P匹配结束了,所以进行此步处理
		return (*ptr=='\0'); 
    }
};


 


还有人使用Greedy方法,将* 作为一个分隔符,将P串以*为间隔分块,然后在字符串里看是否这些块按顺序出现的办法。

http://blog.csdn.net/magisu/article/details/17020173

相关文章:

  • 快马探营:移动MM“热料”解密
  • [LeetCode]-Integer to Roman 阿拉伯数字转罗马数字
  • Ado.Net操作Excel文件数据常见问题及解决
  • [LeetCode]—Roman to Integer 罗马数字转阿拉伯数字
  • vim 全局批量替换
  • [LeetCode]—Anagrams 回文构词法
  • 一个简单的读写文件程序-适用于MTK平台资源管理
  • [LeetCode]—Simplify Path 简化路径表达式
  • 如何编写跨平台应用程序
  • Gartner:2009~2010年值得关注的8大移动技术
  • 金玉良言十六句
  • 将 Flex 集成到 Java EE 应用程序的最佳实践
  • Java软件工程师几个面试问题
  • 互联网创业几个思路
  • Asp.net 中文件以Binary 形式数据库的保存和读取
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript设计模式与开发实践系列之策略模式
  • Python socket服务器端、客户端传送信息
  • Quartz初级教程
  • SegmentFault 2015 Top Rank
  • zookeeper系列(七)实战分布式命名服务
  • 电商搜索引擎的架构设计和性能优化
  • 番外篇1:在Windows环境下安装JDK
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 面试遇到的一些题
  • 手写双向链表LinkedList的几个常用功能
  • 手写一个CommonJS打包工具(一)
  • 我这样减少了26.5M Java内存!
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #Lua:Lua调用C++生成的DLL库
  • (1)STL算法之遍历容器
  • (6)STL算法之转换
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (补)B+树一些思想
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (一)为什么要选择C++
  • (转) Android中ViewStub组件使用
  • (转)关于多人操作数据的处理策略
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • **python多态
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net CHARTING图表控件下载地址
  • .Net Core与存储过程(一)
  • .net framework profiles /.net framework 配置
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • ??javascript里的变量问题