【华为OD题库-063】字符匹配-java

2023-12-05 08:28

本文主要是介绍【华为OD题库-063】字符匹配-java,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

给你一个字符串数组(每个字符串均由小写字母组成)和一个字符规律(由小写字母和.和组成),识别数组中哪些字符串可以匹配到字符规律上。".“匹配任意单个字符,”*"匹配零个或多个前面的那一个元素,所谓匹配,是要涵盖整个字符串的,而不是部分字符串。
输入描述:
第一行为空格分割的多个字符串,1<单个字符串长度<100,1<字符串个数<100
第二行为字符规律,1<=字符规律长度<=50
不需要考虑异常场景
输出描述:
匹配的字符串在数组中的下标(从0开始),多个匹配时,下标升序并用,分割,若均不匹配输出-1
示例1:
输入
ab aab

.*
输出
0,1

思路

正则匹配

匹配模式加上首尾限定^$可判断是否完全匹配

动态规划

同leetcode:10. 正则表达式匹配

不利用正则匹配,使用动态规划可判断当前字符s是否和给定匹配模式p完全匹配。
dp[i][j]定义:s[:i]和p[:j]匹配是否匹配,其中s[:i]代表s的前i个字符(s[:0]代表取0个s的字符)
初始化:dp[0][0]=1,空字符串和空模式是匹配的,所以为1。考虑s为空,p=a*b*c*的模式,当p的偶数位为*时,dp[0][j]=dp[0][j-2]
递推关系:根据当前p的字符是否为*判断,只有以下情况dp[i][j]才可能为1(标黄色部分匹配即可)
如果p[j-1]== *
dp[i][j - 2] == 1,如s= a ; p= a b*
dp[i-1][j] == 1&&s[i-1]==p[j-2],如s= abb ; p= ab*
dp[i-1][j] == 1&&‘.’==p[j-2],如s= abb ; p= a.*
如果p[j-1]!= *
dp[i-1][j-1] == 1&&‘.’==p[j-1],如s= ab ; p= a.
dp[i-1][j-1] == 1&&s[i-1]==p[j-1],如s= ab ; p= ab

题解

package hwod;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class StrMatch {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] strArr = sc.nextLine().split(" ");String p = sc.nextLine();List<Integer> res = strMatch2(strArr, p);if (res.size() == 0) {System.out.println(-1);return;}for (int i = 0; i < res.size(); i++) {if (i != 0) System.out.print(",");System.out.print(res.get(i));}}//方案一:正则匹配private static List<Integer> strMatch(String[] strArr, String p) {List<Integer> res = new ArrayList<>();p = "^" + p + "$";for (int i = 0; i < strArr.length; i++) {if (strArr[i].matches(p)) {res.add(i);}}return res;}//方案二:动态规划private static List<Integer> strMatch2(String[] strArr, String p) {List<Integer> res = new ArrayList<>();for (int i = 0; i < strArr.length; i++) {if (checked(strArr[i], p)) {res.add(i);}}return res;}private static boolean checked(String s, String p) {int m = s.length() + 1, n = p.length() + 1;int[][] dp = new int[m][n]; //s[:i]和p[:j]匹配dp[0][0] = 1;for (int i = 2; i < n; i += 2) {if (p.charAt(i - 1) == '*') dp[0][i] = dp[0][i - 2];}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (p.charAt(j - 1) == '*') {if (dp[i][j - 2] == 1 //a  ab*|| (dp[i - 1][j] == 1 && s.charAt(i - 1) == p.charAt(j - 2)) // abb ab*|| (dp[i - 1][j] == 1 && p.charAt(j - 2) == '.')  // abb a.*) dp[i][j] = 1;} else {if ((dp[i - 1][j - 1] == 1 && p.charAt(j - 1) == '.') // ab a.|| (dp[i - 1][j - 1] == 1 && p.charAt(j - 1) == s.charAt(i - 1)) //ab ab) dp[i][j] = 1;}}}return dp[m - 1][n - 1] == 1;}
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

这篇关于【华为OD题库-063】字符匹配-java的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/456837

相关文章

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版