列表

详情


HJ71. 字符串通配符

描述

问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同)
?:匹配1个字符

注意:匹配时不区分大小写。

输入:
通配符表达式;
一组字符串。

输出:

返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false
数据范围:字符串长度:
进阶:时间复杂度:,空间复杂度:

输入描述

先输入一个带有通配符的字符串,再输入一个需要匹配的字符串

输出描述

返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false

示例1

输入:

te?t*.*
txt12.xls

输出:

false

示例2

输入:

z
zz

输出:

false

示例3

输入:

pq
pppq

输出:

false

示例4

输入:

**Z
0QZz

输出:

true

示例5

输入:

?*Bc*?
abcd

输出:

true

示例6

输入:

h*?*a
h#a

输出:

false

说明:

根据题目描述可知能被*和?匹配的字符仅由英文字母和数字0到9组成,所以?不能匹配#,故输出false

示例7

输入:

p*p*qp**pq*p**p***ppq
pppppppqppqqppqppppqqqppqppqpqqqppqpqpppqpppqpqqqpqqp

输出:

false

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 308KB, 提交时间: 2021-08-15

#include<stdio.h>
int isCorrect(char ch){
    if(isdigit(ch)||isalpha(ch))return 1;
    else return 0;
}
int compare(char*tem,char*str)
{
    int i=0,j=0,tempi=0,tempj=0,flag=0;
    
    while(j<strlen(str))
    {
        tem[i]=tolower(tem[i]);
        str[j]=tolower(str[j]);
        
        if(tem[i]=='*')
        {
            tempi=i;
            i++;
            flag=1;
            tempj=j;
        }
        else if(tem[i]==str[j]||(tem[i]=='?'&& isCorrect(str[j]))){
            i++;
            j++;
        }
        else if(flag ==1){
            j=++tempj;
            i=tempi;
        }
        else
            return 0;
        
    }
    while(tem[i]=='*'&&tem[i]!='\0')
        i++;
    if(tem[i]==0)
        return 1;
    return 0;
}
int main ()
{
    char comp[500]={0};
    char str[500]={0};
    while(scanf("%s%s",&comp,&str)!=EOF)
    {
        if(compare(comp,str))
            printf("true\n");
        else
            printf("false\n");
    }
}

C 解法, 执行用时: 2ms, 内存消耗: 280KB, 提交时间: 2021-09-04

#include<stdio.h>
#include<string.h>
  
int max(int a, int b)
{
    return a>b?a:b;
}
int match(char a[] ,char b[])
{
    int lena = strlen(a);
    int lenb = strlen(b);
    int dp[100][100] = {0};
    dp[0][0] = 1;
    for(int j = 0;j < lenb;j++)
    {
        if((b[j] == '.') || ((b[j] >= '0') && (b[j] <= '9')) || ((b[j] >= 'a') && (b[j] <= 'z')) || ((b[j] >= 'A') && (b[j] <= 'Z')))
        {
            continue;
        }
        else
        {
            return 0;
        }
    }
    for(int i = 1;i <= lena;i++)
    {
        if(a[i - 1] == '*')
        {
            dp[i][0] = 1;
        }
        else
        {
            break;
        }
    }
    for(int i = 1;i <= lena;i++)
    {
        for(int j = 1;j <= lenb;j++)
        {
            if(a[i - 1] == '?')
            {
                dp[i][j] = max(dp[i][j] , dp[i-1][j-1]);
            }
            if((a[i - 1] == b[j - 1]) || (a[i - 1] == b[j - 1] + 32) || (a[i - 1] == b[j - 1] - 32))
            {
                dp[i][j] = max(dp[i][j] , dp[i-1][j-1]);
            }
            if(a[i - 1] == '*')
            {
                dp[i][j] = max(dp[i][j] , (dp[i-1][j] || dp[i][j - 1]));
            }
        }
    }
    return dp[lena][lenb];
      
}
  
int main()
{
    int m;
    char a[100],b[100];
    while(scanf("%s",&a) != EOF)
    {
        scanf("%s",&b) ;
        m = match(a, b);
         if(m == 1)
    {
        printf("true\n");
    }
    else{
        printf("false\n");
    }
    }
}

上一题