码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode】Wildcard Matching

时间:2015-01-10 22:20:52      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

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==\0&&*p==\0) return true;
 6         if(*s!=\0&&*p==\0) return false;
 7         if(*s==\0&&*p!=\0) return false;
 8        
 9         if(*p==*)
10         {
11             while(*p==*) p++;
12  
13            
14             while(*s!=\0)
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!=\0)
 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==\0) return true;
42         else return false;
43     }
44 };

 

 
 

【leetcode】Wildcard Matching

标签:

原文地址:http://www.cnblogs.com/reachteam/p/4215722.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!