深信服入職前編碼訓練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