题目描述:
函数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 }