【华为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),查看当前专栏更新的所有题目。

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

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

相关文章

字符指针变量数组指针变量

字符指针变量 在指针的类型中&#xff0c;我们知道有一种指针叫做字符指针 一般的使用情况如下&#xff1a; #include<stdio.h> int main() {char ch w;char* pa &ch;*pa h;printf("%c", *pa);return 0; } 还有一种使用方法如下&#xff1a; #incl…

国内 AI 成图第一案!你来你会怎么判?

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K 哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…

室内外融合便携式定位终端5G+UWB+RTK

一、介绍 便携式定位终端主要用于提供高精度的位置数据&#xff0c;支持室内UWB定位和室外北斗系统定位功能&#xff0c;支持5G公网和5G专网通信功能&#xff0c;便携式定位终端中超宽带(UWB)和实时动态(RTK)技术的集成代表了精确位置跟踪方面的重大进步。这款UWBRTK便携式定位…

git 本地改动无法删除

1. 问题 记录下git遇到奇怪的问题&#xff0c;本地有些改动不知道什么原因无法删除 git stash&#xff0c; git reset --hard HEAD 等都无法生效&#xff0c;最终通过强制拉取线上解决 如下图&#xff1a; 2. 解决 git fetch --all git reset --hard origin/master执行这两…

Android RatingBar实现五星好评

属性 isIndicatorRatingBar 是否为指示器&#xff0c;为true时&#xff0c;用户将无法交互操作&#xff0c;默认为false。 numStars 显示的星型数量&#xff0c;必须是一个整形值&#xff0c;像“50”&#xff0c;虽然可以设置很大&#xff0c;但一般…

Java拆分集合

在对数据进行批量操作的时候&#xff0c;由于数据量太大&#xff0c;需要对数据进行拆分操作&#xff0c;分成N个小集合。 代码如下&#xff1a; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil;import java.util.ArrayList; import java.u…

java多线程学习- 下

六. 线程管理 6.1 线程组 类似于在计算机中使用文件夹管理文件, 也可以使用线程组来管理线程,在线程组中定义一组相似(相关)的线程. 在线程组中也可以定义子线程组, Thread 类有几个构造方法允许在创建线程时指定线程组,如果创建线程时没有指定线程组则该线程就属于浮现出所在…

STM32-新建工程(标准库)

目录 STM32F10x新建工程&#xff08;标准库&#xff09; 移植文件夹 新建工程 添加启动文件和必需文件 在工程中加载新添加的文件 在工程中添加文件路径 在工程中添加main函数 添加lib库 添加必需文件 添加宏定义 STM32F10x新建工程&#xff08;标准库&#xff09; …

【Python】创建简单的Python微服务Demo与FastAPI

创建简单的Python微服务Demo与FastAPI 在微服务架构中&#xff0c;通过FastAPI框架创建一个简单的Python微服务Demo涉及多个步骤&#xff0c;包括定义服务、使用框架、进行通信等。在这篇文章中&#xff0c;我们将使用FastAPI框架创建两个简单的微服务&#xff0c;它们通过RES…

HBase安装配置:一键自动安装配置

使用shell脚本一键下载、安装、配置HBase&#xff08;单机版&#xff09; 1. 把下面的脚本复制保存为/tmp/install_hbase.sh文件 #!/bin/bash# 安装之前确保安装目录有写入权限&#xff0c;若没有&#xff0c;自行增加 # 安装版本 zk_version"2.4.8" # 安装目录 zk…

【WxPusher】消息推送小案例

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 WxPusher后台 WxPusher文档 一、注册WxPusher 进入后台获取你的token 二、使用步骤 1.编写脚本 参数如下&#xff08;示例&#xff09;&#xff1a; {"appToken": "AT_AnXubGNGCe7OVN…

基于Java SSM企业用电管理系统

企业用电管理系统是供电部门对所辖区域的企业用电进行管理的系统&#xff0c;假设企业全部采用分时电表&#xff0c;分谷(低谷时段)、峰(高峰时段)时段分别计量。系统涉及的信息及操作有&#xff1a; 用电企业&#xff1a;用电企业编号、用电企业名、地址、电话、联系人等。 电…

基于springboot的校园二手市场

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Redis skiplist源码解析(支持范围查询)

跳表是一个多层的有序链表&#xff0c;在跳表中进行查询操作时&#xff0c;查询代码可以从最高层开始查询。层数越高&#xff0c;结点数越少&#xff0c;同时高层结点的跨度会比较大。因此&#xff0c;在高层查询结点时&#xff0c;查询一个结点可能就已经查到了链表的中间位置…

LeetCode:2477. 到达首都的最少油耗(DFS C++、Java)

目录 2477. 到达首都的最少油耗 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 2477. 到达首都的最少油耗 题目描述&#xff1a; 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n…

医院预约挂号平台的设计与实现

摘 要 网络的空前发展给人们的工作和生活带来了极大的便利&#xff0c;信息技术已成为节约运营成本、提高工作效率的首选。相比之下&#xff0c;国内相当多的中小医院在医院预约工作中的手工工作比较保守&#xff0c;数据查询和存储成本都很高&#xff0c;但效率很低。为了使医…

JAVAEE初阶 多线程基础(六)

wait,notify,饿汉模式 一.wait,notify方法使用1.1 例子 二.wait和sleep区别三.单例模式中的饿汉模式 一.wait,notify方法使用 引入wait和notify为了能够从应用层面上,干预到多个不同线程代码的执行顺序,不是影响系统的线程调度策略. 相当于是在应用程序代码中,让后执行的线程,主…

支付宝沙箱支付

1. 二维码 1.1 什么是二维码&#xff1a; ​ 二维码又称QR Code&#xff0c;QR全称Quick Response&#xff0c;是一个近几年来移动设备上超流行的一种编码方式&#xff0c;它比传统的Bar Code条形码能存更多的信息&#xff0c;也能表示更多的数据类型。 ​ 二维条码/二维码&…

leetcode LCR 083. 全排列

Problem: LCR 083. 全排列 思路 使用一个visited数组来记录每一轮递归中数字被使用情况&#xff0c;dfs Code /*** param {number[]} nums* return {number[][]}*/ var permute function(nums) {const len nums.lengthconst cur [] // 当前轮次的排列结果const res [] /…

【2023.12.4练习】数据库知识点复习测试

概论 数据表&#xff1a;用于存储现实中数据的联系。 储存信息联系。 字段&#xff1a;又称列&#xff0c;如姓名、年龄、编号等。 记录&#xff1a;又称元组&#xff0c;为数据表中的一行&#xff0c;代表了一个实体的信息。 数据库&#xff08;DB&#xff09;&#xff1…