华为OD机考题(HJ71 字符串通配符)

前言

经过前期的数据结构和算法学习,开始以OD机考题作为练习题,继续加强下熟练程度。

描述

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

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

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

输出:

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

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

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

输入描述:

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

输出描述:

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

示例1

输入:

te?t*.*
txt12.xls

输出:

false

实现原理与步骤

  • 初始化

    • dp[0][0]表示空字符串和空模式匹配。
    • 如果模式p的字符是'*',则dp[0][j]的值取决于dp[0][j - 1],表示'*'可以匹配空字符串。
  • 填充DP数组

    • 遍历字符串s和模式p的所有字符。
    • 如果模式字符是'*',则dp[i][j]可以由两种情况决定:
      • dp[i - 1][j]'*'匹配一个或多个字符。
      • dp[i][j - 1]'*'匹配空字符串。
    • 如果模式字符是'?'或与字符串字符相等,则dp[i][j]dp[i - 1][j - 1]决定,表示这两个字符匹配。
  • 返回结果

    • 返回dp[sLen][pLen],表示字符串s和模式p的匹配结果。

此题为难度系数为中等略有不妥,另外需注意题干中?和*只能匹配数字和英文字母。

实现代码

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别String p = in.nextLine();String s = in.nextLine();System.out.println(isMatch(s, p)); // 输出:true 或 false}public static boolean isMatch(String s, String p) {int sLen = s.length();int pLen = p.length();// 创建一个DP数组,dp[i][j]表示s的前i个字符和p的前j个字符是否匹配boolean[][] dp = new boolean[sLen + 1][pLen + 1];// 初始化dp[0][0] = true; // 空字符串和空模式是匹配的// 初始化首行,s为空,只有p全是'*'才能匹配for (int j = 1; j <= pLen; j++) {if (p.charAt(j - 1) == '*') {dp[0][j] = dp[0][j - 1];}}// 填充DP数组for (int i = 1; i <= sLen; i++) {for (int j = 1; j <= pLen; j++) {if (p.charAt(j - 1) == '*') {// '*' 可以匹配任意字符串(包括空字符串)//if(isNumOrWord(s.charAt(i-1))){dp[i][j] = dp[i - 1][j] || dp[i][j - 1];//}} else if ((p.charAt(j - 1) == '?' && isNumOrWord(s.charAt(i - 1))) ||Character.toString(s.charAt(i - 1)).equalsIgnoreCase(Character.toString(p.charAt(j - 1)))) {// '?' 可以匹配任意一个字符dp[i][j] = dp[i - 1][j - 1];}}}return dp[sLen][pLen];}public static boolean isNumOrWord(char c) {if (c - 'a' >= 0 && c - 'a' <= 26) {return true;} else if (c - '0' >= 0 && c - '0' <= 9) {return true;}return false;}}

1.QA:

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

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

相关文章

AI:助力开发者翱翔,而非抢夺其舞台

在当今这个科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;犹如一股春风&#xff0c;悄然渗透进全球各个行业&#xff0c;尤其在软件开发领域&#xff0c;其影响力日益显著。从初创企业到跨国巨头&#xff0c;无一不在积极探索AI如何重塑编程的面貌&#xf…

护眼灯什么价位的好?好用又实惠的护眼灯推荐

护眼灯&#xff0c;简单来说就是保护视力的台灯&#xff0c;专业的护眼台灯的光线与自然光光线相似&#xff0c;有亮度稳定、不闪烁&#xff0c;发光面积大等这些特点。那么&#xff0c;护眼灯什么价位的好&#xff1f;市面上所出现的护眼台灯良莠不齐&#xff0c;价格低的质量…

Spring容器加载Bean和JVM加载类

1、JVM加载类 类的加载是在首次需要访问类的信息或实例化类的对象时发生的过程。ClassLoader负责加载类的字节码&#xff0c;并在内存中创建对应的Class对象&#xff0c;从而使得Java程序能够操作和使用这些类。 在Java中&#xff0c;类的加载是按需进行的&#xff0c;也就是…

【源码+文档+调试讲解】文物管理系统

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

warning: LF will be replaced by CRLF the next time Git touches it warning

问题&#xff1a; warning: in the working copy of , LF will be replaced by CRLF the next time Git touches it warning: 今天上传git时报错&#xff0c;使用Ai&#xff1b;得知&#xff1b; 解决&#xff1a; 将 Git 配置为不自动转换换行符&#xff0c;使用以下命令…

一.5 高速缓存至关重要

这个简单的示例揭示了一个重要的问题&#xff0c;即系统花费了大量的时间把信息从一个地方挪到另一个地方。hello程序的机器指令最初是存放在硬盘上&#xff0c;当程序加载时&#xff0c;它们被复制到主存&#xff1b;当处理器运行程序时&#xff0c;指令又从主存复制到处理器。…

触摸屏虚拟键盘组件 jQuery Virtual Keyboard使用 自定义键盘

如何在触摸设备上为输入域添加虚拟键盘&#xff1f; 一个插件可以解决这个问题&#xff0c;关键还支持高度自定义&#xff08;git地址&#xff09;&#xff1a; GitHub - Mottie/Keyboard: Virtual Keyboard using jQuery ~ 官网地址&#xff1a;Virtual Keyboard 使用步骤&…

大模型学习笔记0-前言

在当前人工智能技术快速发展的背景下&#xff0c;大模型成为了这个领域最为耀眼的焦点之一。它们不仅在机器学习的很多子领域表现突出&#xff0c;还在众多实际应用中展现出巨大的潜力与价值。因此&#xff0c;对于任何致力于深入了解当代AI技术的学习者来说&#xff0c;掌握大…

3. 积分之迷

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明开了个网上商店&#xff0c;卖风铃。共有 33 个品牌&#xff1a;&#x1d434;&#xff0c;&#x1d435;&#xff0c;&#x1d436;A&#xff0c;B&#xff0c…

NISP证书备考指南与经验分享

在信息安全领域&#xff0c;NISP(国家信息安全水平考试)作为衡量专业能力的重要标尺&#xff0c;不仅是职场晋升的敲门砖&#xff0c;更是个人技能提升的关键一步。面对这一挑战&#xff0c;如何高效备考&#xff0c;成为众多学员关注的焦点。今天&#xff0c;为您精心打造这份…

原生APP开发的优势

原生APP开发是指使用特定的编程语言和开发工具&#xff0c;针对特定的操作系统平台进行开发的应用程序。相比于混合开发和Web开发&#xff0c;原生APP开发具有以下优势。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 性能更优 原…

Python和numpy相关函数

目录 一、python中变量前面有个*二、numpy.prod三、numpy.savez四、 arr[..., ::-1]五、 yield六、 string.join()七、 numpy.random.choice() 一、python中变量前面有个* 在Python中&#xff0c;变量前面的星号&#xff08;*&#xff09;有多种用法&#xff0c;主要与函数参数…

Spring Boot Vue 毕设系统讲解 3

目录 项目配置类 项目中配置的相关代码 spring Boot 拦截器相关知识 一、基于URL实现的拦截器&#xff1a; 二、基于注解的拦截器 三、把拦截器添加到配置中&#xff0c;相当于SpringMVC时的配置文件干的事儿&#xff1a; 项目配置类 项目中配置的相关代码 首先定义项目认…

实例分割:深度学习在图像识别中的突破

标题&#xff1a;实例分割&#xff1a;深度学习在图像识别中的突破 实例分割是计算机视觉领域中的一项高级任务&#xff0c;它不仅识别图像中的多个对象&#xff0c;还精确地定位每个对象的边界。这项技术是目标检测和语义分割的结合&#xff0c;能够区分同类对象中的个体差异…

【亲测解决】No module named _cffi_backend

微信公众号&#xff1a;leetcode_algos_life&#xff0c;代码随想随记 小红书&#xff1a;412408155 CSDN&#xff1a;https://blog.csdn.net/woai8339?typeblog &#xff0c;代码随想随记 GitHub: https://github.com/riverind 抖音【暂未开始&#xff0c;计划开始】&#xf…

FPGA之 串口UART通信

FPGA之串口UART通信 1. UART发送模块&#xff08;Transmitter&#xff09;2. UART接收模块&#xff08;Receiver&#xff09;3. testbench4. 边沿检测电路 串口&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;UART&#xff09;是一种串行通信协议&#x…

通义千问Qwen-VL-Chat大模型本地部署(一)

目录 前言 环境准备 软件安装 其它库安装启动项目 FASTAPI 小结 前言 人工智能大模型是一种能够利用大数据和神经网络来模拟人类思维和创造力的人工智能算法。它利用海量的数据和深度学习技术来理解、生成和预测新内容&#xff0c;通常情况下有数十亿乃至数百亿个参数&#xf…

什么?这动物图片可以上国家地理?

stable difussion中大部分的模型都是关于人的,今天交给大家一些不一样的:如何生成动物图片。在这篇文章中我们将会学到如何生成逼真的动物&#xff0c;可爱的动物&#xff0c;还有幻想中的动物。 准备工作 当然前提是你需要一个SD的软件&#xff0c;你可以用本地的SD webUI或…

关于CM4内核的单片机使用sprintf格式化浮点数导致程序跑飞的问题

问题现象 基于freeRTOS和Contex-M4内核的单片机&#xff0c;在使用sprintf格式化浮点数时&#xff0c;由于打开了看门狗复位&#xff0c;导致程序频繁重启&#xff0c;不开看门狗复位&#xff0c;程序就会卡死。而同样的程序在切换到Contex-M3内核的单片机时&#xff0c;就能正…

解析 unstructured pdfminer_utils.py rect_to_bbox 坐标转换函数

解析 unstructured pdfminer_utils.py rect_to_bbox 坐标转换函数 1. 函数定义2. 函数说明3. 函数实现举例说明总结 今天,我们来学习一个有趣的Python函数。这个函数可以帮助我们转换PDF文档中的坐标。虽然听起来很复杂,但是我们可以通过一个简单的例子来理解它。 1. 函数定义…