深信服入职前编码训练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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM