牛客出bug(华为机试HJ71)

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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java --- Mybatis的动态sql标签

一、if标签 <select id"queryEmpByCondition" resultType"User">select * from t_user where 11<if test"username ! null and username ! ">and username #{username}</if></select> if&#xff1a;根据标签中的test…

AWTK 与 Qt 的异同点比较

相似之处&#xff1a; 跨平台支持&#xff1a; AWTK 和 Qt 都提供了跨平台的支持&#xff0c;可以在多种操作系统上进行开发和部署&#xff0c;包括 Windows、Linux、macOS 等。丰富的组件库&#xff1a; 两者都提供了丰富的图形界面组件库&#xff0c;能够满足各种应用程序的…

pytest全局变量的使用

这里重新阐述下PageObject设计模式&#xff1a; PageObject设计模式是selenium自动化最成熟&#xff0c;最受欢迎的一种模式&#xff0c;这里用pytest同样适用 这里直接提供代码&#xff1a; 全局变量 conftest.py """ conftest.py 全局变量&#xff0c;主要实…

华为eNSP实验-三层交换机的不同网段通信(通过OSPF路由方式)

1.拓扑图 2.过程如下 2.1 首先PC1和PC2配置好IP地址 2.2 在SW1上配置虚拟网关及VLAN <Huawei>system-view [Huawei]sysname SW1 [SW1]undo info-center enable [SW1] [SW1]vlan batch 10 20 [SW1]interface GigabitEthernet 0/0/1 [SW1-GigabitEthernet0/0/1]port li…

docker.service配置docker镜像加速

加速器配置方法很多&#xff0c;小白我用的是docker.service文件&#xff0c;所以直接在里面配置啊 配置以后&#xff0c;要systemctl daemon-reload下 &#xff0c;然后docker info 下看下镜像地址是否是自己已配置的 docker run --privilegedtrue --name mytomcat -p 8080…

利用QT画图像的直方图

1.什么是直方图 直方图是一种图形化展示数据频率分布的方式。它将样本数据分成一系列相邻的区间&#xff0c;统计每个区间内数据所占比例或数量&#xff0c;并用矩形条形图表现出来。直方图可以反映样本数据的分布情况&#xff0c;例如它们的集中趋势、对称性和离散程度等。 …

2011年03月17日 Go生态洞察:探索Go与C的交互——Cgo

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【深度学习】手写数字识别

文章目录 一、步骤1.导包2.查看数据集图片3.多层感知器4.结果 总结 一、步骤 1.导包 #导入需要的包 import numpy as np import paddle as paddle import paddle.fluid as fluid from PIL import Image import matplotlib.pyplot as plt import os from paddle.fluid.dygraph…

Linux awk命令

除了使用 sed 命令&#xff0c;Linux 系统中还有一个功能更加强大的文本数据处理工具&#xff0c;就是 awk。 曾有人推测 awk 命令的名字来源于 awkward 这个单词。其实不然&#xff0c;此命令的设计者有 3 位&#xff0c;他们的姓分别是 Aho、Weingberger 和 Kernighan&#x…

第十八章Swing程序设计总结

例题18.1&#xff1a;第一个窗体程序 例题18.2&#xff1a;在窗体中弹出对话框 例题18.3&#xff1a;弹出会话框&#xff0c;问用户准备好了吗&#xff1f; 例题18.4&#xff1a;弹出会话框&#xff0c;询问用户是否离开 例题18.5&#xff1a;弹出会话框&#xff0c;让用户输入…

[LeetCode]-160. 相交链表-141. 环形链表-142.环形链表II

目录 160.相交链表 题目 思路 代码 141.环形链表 题目 思路 代码 142.环形链表II 题目 思路 代码 160.相交链表 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 给你两个…

开源七轴myArm协作机械臂正逆运动学技术讲解

引言&#xff1a; 在本文中&#xff0c;我们将深入探讨机器人学的两个核心概念&#xff1a;正运动学和逆运动学。这两个概念是理解和控制机械臂运动的基础。通过一个具体的7轴机械臂实例&#xff0c;我们将详细介绍如何计算机械臂的正运动学和逆运动学。我们首先会解释正运动学…

[设计模式] 建造者模式

一、引言 起因是学习okhttp过程中遇到的这段代码 Request request original.newBuilder().url(original.url()).header("Authorization", "Bearer " BearerTokenUtils.getToken(configuration.getApiKey(), configuration.getApiSecret())).header(&quo…

《第三期(先导课)》之《Python 开发环境搭建》

文章目录 《第 1 节 初始Python》《第 6 节 pip包管理工具》 《第 1 节 初始Python》 。。。 《第 6 节 pip包管理工具》 pip是Python的包管理工具,用于安装、升级和管理Python包。 pip是Python标准库之外的一个第三方工具,可以从Python Package Index(PyPI)下载和安装各种P…

在PostgreSQL中创建和管理数据库

PostgreSQL是一个强大、开源的关系型数据库管理系统&#xff0c;它提供了丰富的功能和灵活的配置选项&#xff0c;使得它成为许多开发者和组织的首选数据库之一&#xff0c;接下来我会介绍如何在PostgreSQL中创建和管理数据库。 一、安装和配置PostgreSQL 第一步&#xff0c;…

嵌软工程师要掌握的硬件知识2:一文看懂什么是开漏和推挽电路(open-drain / push-pull)

文 / 黑猫学长 本文根据笔者个人工作/学习经验整理而成,如有错误请留言。 文章为付费内容,已加入原创侵权保护,禁止私自转载及抄袭。 文章所在专栏: 嵌软工程师要掌握的硬件知识 1 推挽(push pull)电路 1.1 理解什么是推挽电路 - 详细介绍 如图所示,Q3是个NPN型三极管…

【mysql】CommunicationsException: Communications link failure

CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 通信异常&#xff1a;通信链路故障 最后一个成功发送到服务器的数据包是0毫秒前…

【Unity实战】实现强大通用易扩展的对话系统(附项目源码)

先看看实现的最终效果 前言 之前的对话系统因为存在一些错误和原作者不允许我分享&#xff0c;所以被我下架了&#xff0c;而且之前对话系统确实少了一些功能&#xff0c;比如最基本的逐字打印功能&#xff0c;原本来是打算后面补充的。 对话系统在游戏中实现太常见了&#x…

基于 Python 的课程助教智能聊天机器人

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 课程助教是高校中一种常见的教学模式,其在学生理论知识的掌握与实践能力的提高方面起到关键性的作用,已经成为高校日常教育环节中不可或缺的一环。然而,传统的人力助教有若干关键问题亟待…

Leangoo领歌免费Scrum管理工具中如何看到关于自己的所有任务?

个人工作台 个人工作台是个人最新待办工作的展示区域&#xff0c;它展示了个人所有的待办任务&#xff0c;最新访问的项目和工作动态&#xff0c;当一个人在多个项目和看板上工作时&#xff0c;它可以帮助个人快速看到个人在各个项目的工作&#xff0c;快速进入任务看板处理任…