1
+ /*
2
+ * Implement wildcard pattern matching with support for '?' and '*'.
3
+ * '?' Matches any single character.
4
+ * '*' Matches any sequence of characters (including the empty sequence).
5
+
6
+ * The matching should cover the entire input string (not partial).
7
+
8
+ * The function prototype should be:
9
+ * bool isMatch(const char *s, const char *p)
10
+
11
+ * Some examples:
12
+ * isMatch("aa","a") ? false
13
+ * isMatch("aa","aa") ? true
14
+ * isMatch("aaa","aa") ? false
15
+ * isMatch("aa", "*") ? true
16
+ * isMatch("aa", "a*") ? true
17
+ * isMatch("ab", "?*") ? true
18
+ * isMatch("aab", "c*a*b") ? false
19
+ * Created by supercoderx on 2017/8/14.
20
+ */
21
+ #include "../main.h"
22
+
23
+ #include
24
+
25
+ bool isWildcardMatch (char * s , char * p ) {
26
+ int patternLen = 0 , ques = 0 ,asterisk = 0 ;
27
+ char * star = NULL , * ss = s , * tmp = p ;
28
+ bool all = true, other = false;
29
+ while (* tmp != '\0' ) {
30
+ patternLen ++ ;
31
+ if (* tmp != '*' )
32
+ all = false;
33
+ if (* tmp == '?' )
34
+ ques ++ ;
35
+ if (* tmp != '?' && * tmp != '*' )
36
+ other = true;
37
+ tmp ++ ;
38
+ }
39
+ if (* s == '\0' && (other || ques > 0 ))
40
+ return false;
41
+ if (* s == '\0' && (patternLen > 0 && (all || !other && ques == 1 )))
42
+ return true;
43
+ while (* s != '\0' ) {
44
+ if (* p == '?' || (* p == * s )) {
45
+ s ++ ;
46
+ p ++ ;
47
+ continue ;
48
+ }
49
+ if (* p == '*' ) {
50
+ star = p ++ ;
51
+ ss = s ;
52
+ continue ;
53
+ }
54
+ if (star ) {
55
+ p = star + 1 ;
56
+ s = ++ ss ;
57
+ continue ;
58
+ }
59
+ return false;
60
+ }
61
+ while (* p != '\0' ){
62
+ if (* p != '*' )
63
+ return false;
64
+ p ++ ;
65
+ }
66
+ return true;
67
+ }
68
+
69
+ void testIsWildcardMatch () {
70
+ printf ("%d" , isWildcardMatch ("a" , "?*?" ));
71
+ }
0 commit comments