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讨论区里面用动态规划去解的方法,看了一下还是有点繁琐,空间复杂度也较大。后来又找到另外的方法,这个叫uniagle的同学把‘*’作为分隔符先拆分再逐个匹配的。感觉还是有点繁琐,应该有更好的办法,于是找到了另一个实现,这个方法很喜欢,因此自己按这个方法搞一波,妥妥地过了。

 1     bool isMatch(const char *s, const char *p) {
 2         /*recusive version
 3         if(*p=='?') {
 4             if(*s=='\0')
 5                 return false;
 6             else
 7                 return isMatch(s+1,p+1);
 8         }
 9         if(*p=='*'&&*(p+1)=='\0') return true;
10         
11         if(*p=='*'){
12             while(*p=='*') p++;
13             for(int i=0;*(s+i)!='\0';i++){
14                 if(isMatch(s+i,p))
15                     return true;
16             }
17             return false;
18         }
19         if(*s==*p) return isMatch(s+1,p+1);
20         else return false;
21         */
22         // loop
23         const char *str,*ptr;
24         bool hasStar=false;
25         for(str=s,ptr=p;*str;str++){
26             if(*ptr=='?'){
27                 if(*s=='\0') return false;
28                 else ptr++;
29             }
30             else if(*ptr=='*'){
31                 hasStar=true;
32                 while(*ptr=='*') ptr++;
33                 if(*ptr=='\0') return true;
34                 p=ptr;
35                 s=str;
36                 str--;
37             }
38             else if(*ptr==*str){
39                 ptr++;
40             }
41             else if(!hasStar) 
42                 return false;
43             else{
44                 ptr=p;
45                 str=s;
46                 s++;
47             }
48         }
49         while(*ptr=='*') ptr++;
50         return *ptr=='\0';
51     }

注释掉的是递归方法,非常简单的版本。完了之后又在网上逛了一下,发现有一个通配符算法总结,这个就比较全了。

posted @ 2013-12-17 21:44  月窟仙人  阅读(212)  评论(0编辑  收藏  举报