深信服入职前编码训练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\n");
59 return 0;
60 }
61
62 if (match(src, ptn) == 0) {
63 printf("match\n");
64 } else {
65 printf("unmatch\n");
66 }
67 return 0;
68 }