牛客出bug(华为机试HJ71)

news2024/11/27 1:39:05

Hj71:字符串通配符

描述

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

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

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

输出:

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

数据范围:字符串长度 1≤s≤100 

进阶:时间复杂度:O(n2) ,空间复杂度 O(n) 

输入描述:

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

输出描述:

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

上述为题目,都提示时间复杂度为 O(n2) 了,基本都能想到动态规划吧,废话不多说,先上代码

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String match = in.nextLine();
        String target = in.nextLine();

        System.out.println(dp(match, target) ? "true" : "false");
    }

    /**
     * pass:32/34
     * eg:
     * a*?*c
     * a@c
     * 预计:false!!!!!!!!!!!!!!!todo sotmw???????
     * 实际:true
     * @param match
     * @param target
     * @return
     */
    public static boolean dp(String match, String target) {
        int m = match.length();
        int n = target.length();
        boolean[][] dp = new boolean[m][n];

        // 初始化dp
        for (int j = 0; j < n; ++j) {
            char c = match.charAt(0);
            if (c == '*') {
                dp[0][j] = true;//通配符匹配多个
                if (m > 1) {
                    dp[1][j] = match.charAt(1) == target.charAt(j);//第一位的 * 可能不匹配,多初始化一行
                }
            }
            if (j == 0 && (c == '?' || c == target.charAt(0))) {//dp[0][0] 必须初始化
                dp[0][j] = true;
            }
        }

        // 常规dp
        for (int i = 0; i < m - 1; ++i) {
            for (int j = 0; j < n - 1; ++j) {
                if (dp[i][j]) {
                    char mat = match.charAt(i + 1);
                    if (mat == '*') {
                        for (int j0 = j; j0 < n; ++j0) {
                            dp[i + 1][j0] = true;
                        }
                    } else if (mat == '?') {
                        dp[i + 1][j + 1] = true;
                    } else {
                        dp[i + 1][j + 1] = mat == target.charAt(j + 1);
                    }
                }
            }
        }
        return dp[m - 1][n - 1];
    }

这个用例用眼睛都能匹配,它告诉我说不行!!!!!!!!就问有没有被坑的感觉!!!!!?

===============================分割线===========================

后来我看到了

*:匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

人为埋雷!!!!!被坑的感觉更强烈了!!!!!!!

搞些杂七杂八的消耗别人的时间精力,完全违背了练习算法的初衷,伤心了

===============================分割线===============================

都写到这个份上了,附上一份完整通过的代码:

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String match = in.nextLine();
        String target = in.nextLine();

        System.out.println(dp(match, target) ? "true" : "false");
    }

    /**
     * pass:32/34
     * eg:
     * a*?*c
     * a@c
     * 预计:false!!!!!!!!!!!!!!!todo sotmw???????
     * 实际:true
     *
     * @param match
     * @param target
     * @return
     */
    public static boolean dp(String match, String target) {
        int m = match.length();
        int n = target.length();
        boolean[][] dp = new boolean[m][n];

        for (int j = 0; j < n; ++j) {
            char c = match.charAt(0);
            if (c == '*') {
                dp[0][j] = true;//通配符匹配多个
                if (m > 1) {
                    dp[1][j] = match(match.charAt(1), target.charAt(j));//第一位的 * 可能不匹配,多初始化一行
                }
            }
            if (j == 0 && match(c, target.charAt(j))) {//dp[0][0] 必须初始化
                dp[0][j] = true;
            }
        }

        // 常规dp
        for (int i = 0; i < m - 1; ++i) {
            for (int j = 0; j < n - 1; ++j) {
                if (dp[i][j]) {
                    char mat = match.charAt(i + 1);
                    if (mat == '*') {
                        for (int j0 = j; j0 < n; ++j0) {
                            dp[i + 1][j0] = checkChar(target.charAt(j0));
                        }
                    } else if (mat == '?') {
                        dp[i + 1][j + 1] = checkChar(target.charAt(j + 1));
                    } else {
                        dp[i + 1][j + 1] = match(mat, target.charAt(j + 1));
                    }
                }
            }
        }
        return dp[m - 1][n - 1];
    }

    /**
     * (注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同)
     *
     * @param c
     * @return
     */
    public static boolean checkChar(char c) {
        return 48 <= c && c <= 57 || 65 <= c && c <= 90 || 97 <= c && c <= 122;
    }

    /**
     * 注意:匹配时不区分大小写。
     * 一个注意就要重新抽一个方法封装
     *
     * @param c1
     * @param c2
     * @return
     */
    public static boolean match(char c1, char c2) {
        if (c1 == '*') {
            return checkChar(c2);
        }
        if (c1 == '?') {
            return checkChar(c2);
        }
        int m = c1 - c2;
        if (m != 0) {
            int c11 = c1, c22 = c2;
            if (65 <= c1 && c1 <= 90) {
                c11 = c1 - 64;
            }
            if (97 <= c1 && c1 <= 122) {
                c11 = c1 - 96;
            }
            if (65 <= c2 && c2 <= 90) {
                c22 = c2 - 64;
            }
            if (97 <= c2 && c2 <= 122) {
                c22 = c2 - 96;
            }
            m = c11 - c22;
        }
        return m == 0;
    }

审题远比搬砖重要,下次做华为的题,首先做个 toKengList.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1177528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

318. 最大单词长度乘积

318. 最大单词长度乘积 难度: 中等 来源: 每日一题 2023.11.06 给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词不含有公共字母。如果不存在这样的两个单词&#xff0c;返回 0 。 示例 1&…

新版Helix QAC 100%覆盖MISRA C++:2023

Helix QAC 2023.3预期将100%覆盖在2023年第四季度发布的新的MISRA C:2023规则。 此外&#xff0c;该版本支持更多的C20语言特性&#xff0c;并改进了Perforce Validate平台和Helix QAC与Validate的集成&#xff0c;以及其他质量改进。 编码标准覆盖率&#xff08;MISRA C:202…

JDK设置编码格式UTF-8

Windows中安装的JDK默认编码格式是GBK 需要修改为UTF-8.在系统中添加系统变量 环境变量 变量名&#xff1a;JAVA_TOOL_OPTIONS 变量值&#xff1a;-Dfile.encodingUTF-8

UE问题盘点

打包后运行时应用程序崩溃 GPU崩溃&#xff08;Timed out waiting for RenderTread after 120.00 secs&#xff09; 分析&解决&#xff1a; 像素流送模式&#xff0c;部署机无显示器无分辨率所致&#xff08;接显示器或显卡欺骗器&#xff09;项目设置Targeted RHIs为Di…

七种事务传播行为,核心只有Required默认和required_new

事务的概念&#xff1a;当一个事务方法被另一个事务方法调用时&#xff0c;这个事务方法应该如何进行事务控制。 结论&#xff1a;一般情况下&#xff0c;你就用默认的把两个事务合并成一个事务&#xff0c;只有当写日志&#xff08;事物之间不互相影响&#xff09;的时候用req…

部署kubevirt教程

前提条件 已安装&#xff1a;kubernetes集群、kubectl、docker apt install -y qemu-kvm libvirt virt-install bridge-utils 【所有节点全部安装】 virt-host-validate qemu部署kubevirt 下载kubevirt-cr.yaml和kubevirt-operator.yaml 先执行&#xff1a; Kubectl apply …

大型企业效率革命:从数字化应用提升到信息化管理平台升级-亿发

数字化转型本质上是一场企业效率的革命&#xff0c;它以连接效率、数据效率和决策效率为核心。所有的转型活动都与人的参与和贡献紧密相关。因此&#xff0c;如何利用数字化手段提升全体员工的数字化应用能力&#xff0c;从而加速商业创新和实现高质量发展&#xff0c;成为管理…

Python武器库开发-常用模块之re模块(十八)

常用模块之re模块(十八) 在Python中需要通过正则表达式对字符串进⾏匹配的时候&#xff0c;可以使⽤⼀个python自带的模块&#xff0c;名字为re模块 我们可以在Python中使用以下的语句&#xff0c;导入re模块&#xff1a; import re正则表达式的大致匹配过程是&#xff1a; …

mybatis在springboot当中的使用

1.当使用Mybatis实现数据访问时&#xff0c;主要&#xff1a; - 编写数据访问的抽象方法 - 配置抽象方法对应的SQL语句 关于抽象方法&#xff1a; - 必须定义在某个接口中&#xff0c;这样的接口通常使用Mapper作为名称的后缀&#xff0c;例如AdminMapper - Mybatis框架底…

petalinux 2022.2 在 ubantu18.04 下的安装

下载 Ubuntu下载&#xff1a; https://releases.ubuntu.com/18.04/ubuntu-18.04.6-desktop-amd64.iso petalinux 下载&#xff1a; https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2022-2.html 安装虚拟机 安装…

leetcode2054

leetcode 2054 #include <iostream> #include <vector> #include <tuple> #include <algorithm>using namespace std;struct Event {// 时间戳int ts;// op 0 表示左边界&#xff0c;op 1 表示右边界int op;int val;Event(int _ts, int _op, int _v…

淘宝婴儿用品购买情况分析报告

一.分析背景和目的 随着购物网站的发展&#xff0c;人们的网络购物行为占比也快速增加。为了能够获取更多的用户&#xff0c;提升商家的销售量&#xff0c;需要从产品和用户不同的角度进行分析&#xff0c;进而得到有价值的信息&#xff0c;指导商家进行获客和营销。本文就以淘…

行情分析——加密货币市场大盘走势(11.6)

大饼昨日下跌过后开始有回调的迹象&#xff0c;现在还是在做指标修复&#xff0c;大饼的策略保持逢低做多。稳健的依然是不碰&#xff0c;目前涨不上去&#xff0c;跌不下来。 以太周五给的策略&#xff0c;入场的已经止盈了&#xff0c;现在已经达到1884&#xff0c;已经全部吃…

Qwt 使用QwtCompass绘制指南针

1.概述 QwtCompass是Qwt库中的一个类&#xff0c;用于绘制一个指南针样式的仪表盘。它是基于QwtDial类的衍生类&#xff0c;提供了一些额外的功能和样式&#xff0c;用于显示方向和角度。 以下是类继承关系&#xff1a; ​ 2.常用方法 void setScaleArc (double minArc, dou…

6张图让你了解openRA 下载及编译

下面的3张图是免费赠送的用vs解决方案编译的方法

C语言每日一题(24)回文素数题解

BC158 [NOIP1999]回文数 题目描述 若一个数&#xff08;首位不为零&#xff09;从左向右读与从右向左读都一样&#xff0c;我们就将其称之为回文数。 例如&#xff1a;给定一个10进制数56&#xff0c;将56加65&#xff08;即把56从右向左读&#xff09;&#xff0c;得到121是…

MoeCTF 2023 Reverse题解

Reverse入门指北 搜索main函数跟进 双击跟进aMoectfF1rstSt3 得到flag base_64 python反编译 - Online Tools 使用在线软件反编译 就是一个变换编码表的base64加密 直接用现有的工具解密 UPX! 查壳&#xff0c;加了UPX壳&#xff0c;直接用官网工具脱壳 打开字符串窗口&am…

网络安全(黑客)-0基础小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

智能安全帽功能-EIS智能防抖摄像头4G定位视频语音气体检测

智能安全帽是一种集成多种智能功能的产品&#xff0c;例如实时定位、语音对讲、健康监测和AI智能预警等。这些丰富的功能能够更好地帮助工人开展工作&#xff0c;并提升安全保障水平。智能安全帽在各个行业中的应用越来越广泛。尤其在工程建设领域&#xff0c;项目管理和工作安…

数据库系统原理与实践 笔记 #7

文章目录 数据库系统原理与实践 笔记 #7数据库设计和E-R模型(续)转换为关系模式具有简单属性的实体集的表示复合属性多值属性联系集的表示模式的冗余—合并 实体-联系设计问题设计问题联系属性的布局 扩展的E-R特性特化概化属性继承特化/概化的设计约束聚集E-R图表示方法总结E-…