深信服入职前编码训练21题--03

题目描述:

函数match检查字符串str是否匹配模板pattern,匹配则返回0,否则返回-1。

模板支持普通字符(a-z0-9A-Z)及通配符?和*。

普通字符匹配该字符本身,?匹配任意一个字符,*匹配任意多个任意字符。

比如字符串abc对下述模板的匹配结果为:

模板 结果 模板 结果
abc 0 a*b -1
a* 0 ab? 0
a*c 0 a? -1

输入描述:

第一行为输入串 第二行为模板串

输出描述:

匹配输出match,不匹配输出unmatch
示例1
输入

abc
a*c

输出

match

分析:采用递归算法,i,j分别指向输入串和模板串的头部。

如果都是字母且匹配,则同时向后走一位。

如果模板串为问号,则同时向后走一位。

如果模板串是星号,则模板串向后走一位,输入串不断向后走,每走一位检查是否匹配,直到匹配或到字符串末尾。

解答:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <malloc.h>
 4 
 5 int _match(const char *str, const char *pat, int i, int j){
 6     int strl = strlen(str);
 7     int patl = strlen(pat);
 8     if(i==strl && j==patl)
 9         return 0;
10     else if(i==strl || j==patl)
11         return -1;
12     if(str[i]==pat[j])
13         return _match(str, pat, i+1, j+1);
14     else if(pat[j]=='?')
15         return _match(str, pat, i+1, j+1);
16     else if(pat[j]=='*')
17         for(int k=i; k<strl; ++k)
18             if(_match(str, pat, k, j+1)==0)
19                 return 0;
20     return -1;
21 }
22 
23 int match(const char *str, const char *pattern)
24 {
25     //TODO:
26     return _match(str, pattern, 0,0);
27 }
28 
29 int input(char **src, char **ptn)
30 {
31     char buf[10240];
32     
33     *src = NULL;
34     *ptn = NULL;
35     if (fgets(buf, sizeof(buf), stdin) == 0)
36         goto failed_;
37     *src = strdup(buf);
38     if (fgets(buf, sizeof(buf), stdin) == 0)
39         goto failed_;
40     *ptn = strdup(buf);
41     return 0;
42 failed_:
43     if (*src)
44         free(*src);
45     if (*ptn)
46         free(*ptn);
47     *src = NULL;
48     *ptn = NULL;
49     return -1;
50 }
51 
52 int main(int argc, char *argv[])
53 {
54     char *src = NULL;
55     char *ptn = NULL;
56     
57     if (input(&src, &ptn) < 0) {
58         fprintf(stderr, "error
");
59         return 0;
60     }
61 
62     if (match(src, ptn) == 0) {
63         printf("match
");
64     } else {
65         printf("unmatch
");
66     }
67     return 0;
68 }