zoukankan      html  css  js  c++  java
  • 【leetcode】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
     
    类似于Regular Expression Matching,会超时
     
     1 class Solution {
     2 public:
     3     bool isMatch(const char *s, const char *p) {
     4        
     5         if(*s==''&&*p=='') return true;
     6         if(*s!=''&&*p=='') return false;
     7         if(*s==''&&*p!='') return false;
     8        
     9         if(*p=='*')
    10         {
    11             while(*p=='*') p++;
    12  
    13            
    14             while(*s!='')
    15             {
    16                 if(isMatch(s,p)) return true;
    17                 s++;
    18             }
    19  
    20    return isMatch(s,p);
    21         }
    22         else if(*p=='?')
    23         {
    24             return isMatch(s+1,p+1);
    25         }
    26         else
    27         {
    28             return (*s==*p&&isMatch(s+1,p+1));
    29         }
    30        
    31        
    32         return false;
    33     }
    34 };
     
     
     
    采用类似回溯的思想
     
    依次对字符进行比对,如果发现p=='*'
    则从(p+1)开始和s开始依次比较,如果发现不对,
    则回溯到(p+1)的位置,再从s+1开始依次比较
    如果再不对,则再次回溯到(p+1)的位置,从s+2位置开始依次比较
    ……
     
     
     1 class Solution {
     2 public:
     3     bool isMatch(const char *s, const char *p) {
     4        
     5        
     6         const char* afterStarPositionP=NULL;
     7         const char* afterStarPositionS=NULL;
     8         while(*s!='')
     9         {
    10             if(*s==*p||*p=='?')
    11             {
    12                 s++;p++;
    13                 continue;
    14             }
    15             else if(*p=='*')
    16             {
    17                 p++;
    18                 afterStarPositionP=p;
    19                 afterStarPositionS=s;
    20             }
    21             else
    22             {
    23                 if(afterStarPositionP!=NULL)
    24                 {
    25                     afterStarPositionS++;
    26                     s=afterStarPositionS;
    27                     p=afterStarPositionP;
    28                 }
    29                 else
    30                 {
    31                     return false;
    32                 }
    33             }
    34         }
    35        
    36         while(*p=='*')
    37         {
    38             p++;
    39         }
    40        
    41         if(*p=='') return true;
    42         else return false;
    43     }
    44 };
     
     
  • 相关阅读:
    各种集群服务
    cdn
    网页请求的完整过程
    html
    ajax异步请求技术
    浅谈前端渲染与后端渲染的区别
    html与php
    Ubuntu安装anaconda3
    win10安装Ubuntu系统
    删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/reachteam/p/4215722.html
Copyright © 2011-2022 走看看