华为机试HJ71:字符串通配符

简介: 华为机试HJ71:字符串通配符

题目描述:

问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。

要求:

实现如下2个通配符:

*:匹配0个或以上的字符(字符由英文字母,数字0-9和 '.' 组成,下同)

?:匹配1个字符


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


输入:

通配符表达式;

一组字符串。


输出:


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


本题含有多组样例输入!

输入描述:

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

输出描述:

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

示例:

输入:


te?t*.*

txt12.xls


输出:

false


解题思路:

本题用动态规划解比递归要方便,而且速度也快些。输入两个字符串,按照各自的尺寸建立二维数组,并定义(0,0)点为true,其他默认为false;每一行首值的取值,取决于上一行首值和通配符字符串s1该位置字符是否为'*',即当s2无字符时,s1只有首字符为'*'才能与其匹配;之后继续填充,首行数值均为false,即s1无字符时,无法进行匹配;从第二行第二列开始,一行行填充,若s1对应位置的字符为'*',则该行的数值由其同行前列和同列前行决定,若其同列前行为true,表明之前的匹配均合理,再考虑到*可以匹配0个字符,所以该位置可以true,但注意,还要判断s2字符是否合理;若该行对应s1字符为正常字母数字,则进行正常比对,若同s2字符一致(不区分大小写),且其前列前行为true,则当前也为true,这是当前已经成功匹配的字符串位置;若s1字符为'?',则只需判断s2字符是否合理,若合理且前列前行也为true,当前也为true。


动态规划的二维表遍历完,最终匹配结果就是v[m][n]。解题完毕。

测试代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 判断字符是否符合要求
bool isOk(char c)
{
    return (isalpha(c)||isalnum(c)||c=='.');
}
bool Match(string s1,string s2)
{
    int m = s1.size();
    int n = s2.size();
    vector<vector<bool>> v(m+1,vector<bool>(n+1,false));
    v[0][0] = true;
    for(int i=1;i<=m;++i)
    {
        v[i][0] = v[i-1][0]&&(s1[i-1]=='*');
        for(int j=1;j<=n;++j)
        {
            if(s1[i-1]=='*'){
                if(isOk(s2[j-1]))
                {
                    v[i][j] = v[i-1][j]||v[i][j-1];
                }
            }else{
                if(tolower(s1[i-1])==tolower(s2[j-1]))
                    v[i][j] = v[i-1][j-1];
                if(s1[i-1]=='?' && isOk(s2[j-1]))
                    v[i][j] = v[i-1][j-1];
            }
        }
    }
    return v[m][n];
}
int main(void)
{
    string s1,s2;
    while(cin>>s1>>s2)
    {
        if(Match(s1, s2)){
            cout << "true" << endl;
        }else{
            cout << "false" << endl;
        }
    }
    return 0;
}


相关文章
|
存储 运维 安全
AIGC时代数据中心运维面临的挑战
AIGC时代数据中心运维面临的挑战
391 1
AIGC时代数据中心运维面临的挑战
|
8月前
|
Apache
Qwen2.5-Coder: 码无止境,学无止境!
Qwen2.5-Coder: 码无止境,学无止境!
|
存储 数据挖掘 BI
数据仓库深度解析与实时数仓应用案例探析
随着数据量的不断增长和数据应用的广泛深入,数据治理和隐私保护将成为数据仓库建设的重要议题。企业需要建立完善的数据治理体系,确保数据的准确性、一致性和完整性;同时加强隐私保护机制建设,确保敏感数据的安全性和合规性。
1054 55
|
传感器 PyTorch 数据处理
流式数据处理:DataLoader 在实时数据流中的作用
【8月更文第29天】在许多现代应用中,数据不再是以静态文件的形式存在,而是以持续生成的流形式出现。例如,传感器数据、网络日志、社交媒体更新等都是典型的实时数据流。对于这些动态变化的数据,传统的批处理方式可能无法满足低延迟和高吞吐量的要求。因此,开发能够处理实时数据流的系统变得尤为重要。
743 1
|
12月前
|
机器学习/深度学习 计算机视觉 Python
目标检测笔记(三):Mosaic数据增强完整代码和结果展示
本文介绍了Mosaic数据增强技术,通过将四张图片拼接成一张新图,极大丰富了目标检测的背景信息。文章提供了完整的Python代码,涵盖了如何处理检测框并调整其位置,以适应拼接后的图像。Mosaic技术不仅提高了学习效率,还在标准化BN计算时同时考虑了四张图片的数据,从而提升了模型的泛化能力。
1105 1
|
JavaScript Linux
2022年超详细在CentOS 7上安装Node.js方法(源码安装)
这篇文章介绍了在CentOS 7系统上通过源码安装Node.js的详细步骤,包括从官网下载Node.js源码包、将安装包上传至虚拟机、解压安装包、删除压缩文件、编译安装Node.js、检查Node.js和npm版本,以及切换npm源到淘宝镜像以加速下载。此外,还提供了一个获取Linux下Node.js离线安装包的微信公众号搜索方式。
|
监控 Oracle 数据可视化
深度解析JVM性能监控工具:推荐与详细用法
深度解析JVM性能监控工具:推荐与详细用法
1569 0
|
SQL 安全 Shell
扫描神器:Netsparker 保姆级教程(附链接)
漏洞扫描神器:Netsparker 保姆级教程(附链接)
扫描神器:Netsparker 保姆级教程(附链接)
|
网络安全 数据安全/隐私保护 开发者
【阿里云镜像】OpenSUSE全新安装并更改阿里OpenSUSE镜像源
【阿里云镜像】OpenSUSE全新安装并更改阿里OpenSUSE镜像源
1379 0
【阿里云镜像】OpenSUSE全新安装并更改阿里OpenSUSE镜像源
|
并行计算 Java 应用服务中间件
JUC并发编程超详细详解篇(一)
JUC并发编程超详细详解篇
2114 1
JUC并发编程超详细详解篇(一)