• 深信服入职前编码训练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
    ");
    59         return 0;
    60     }
    61 
    62     if (match(src, ptn) == 0) {
    63         printf("match
    ");
    64     } else {
    65         printf("unmatch
    ");
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    截图与图片合成的几种方法
    GPUImage 自定义滤镜
    How do I solve the error: An error was encountered while running (Domain = LaunchServicesError, Code = 0) ?
    tableview 重用nib cell
    开发DZ插件教程
    QBImagePickerController 用法
    ALAsset和ALAssetRepresentation
    if exists和if not exists关键字用法
    Java socket 超时
    Android 图片的压缩
  • 原文地址:https://www.cnblogs.com/tenjl-exv/p/12897186.html
Copyright © 2020-2023  润新知