【华为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

相关文章

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.