題目描述:
函數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 }