机试题——字符匹配

题目描述

给你一个字符串数组(每个字符串均由小写字母组成)和一个字符规律(由小写字母和 .* 组成),识别数组中哪些字符串可以匹配到字符规律上。

  • . 匹配任意单个字符。
  • * 匹配零个或多个前面的那一个元素。

所谓匹配,是要涵盖整个字符串的,而不是部分字符串。

输入描述

第一行为空格分隔的多个字符串,单个字符串长度从 1 到 100,字符串个数从 1 到 100。

第二行为字符规律,1 <= 字符规律长度 <= 50。

不需要考虑异常场景。

输出描述

匹配的字符串在数组中的下标(从 0 开始),多个匹配时下标升序并用英文逗号分隔,若均不匹配输出 -1

用例输入

ab aab 
.*
0,1

说明:

  • "ab"a 匹配 .b 匹配 * 可以完全匹配。
  • "aab"a 匹配 .ab 匹配 * 可以完全匹配。
  • 输出对应字符串数组下标 0,1
ab aab 
a.b
1

说明:

  • "aab" 中第一个 a 匹配 a,第二个 a 匹配 .b 匹配 b,可以完全匹配。
  • 输出对应字符串数组下标 1

解题思路

我们使用动态规划来判断字符串是否能够与模式匹配。考虑使用一个二维的 dp 数组来表示匹配情况。dp[i][j] 表示字符串 s 的前 i 个字符是否与模式 p 的前 j 个字符匹配。

  1. 基础状态

    • dp[0][0] = true,表示空字符串和空模式是匹配的。
    • 对于模式中包含 * 的情况,我们需要特别处理。
      • dp[0][j] 表示模式从位置 0 到位置 j 是否可以匹配空字符串。当模式中的字符是 *,它代表前一个字符可以重复零次或者多次。所以,dp[0][j] = dp[0][j-2]
  2. 模式字符匹配

    • . 匹配任意单个字符:如果模式字符是 .,则可以匹配字符串中的任何字符,因此 dp[i][j] = dp[i-1][j-1]
    • 字母匹配:如果模式中的字符与字符串中的字符相同,那么我们也需要检查前面部分是否匹配,即 dp[i][j] = dp[i-1][j-1]
  3. 处理 * 字符

    • * 表示前一个字符可以重复零次或多次。我们需要考虑两种情况:
      1. * 匹配零次:即前一个字符被去除,检查 dp[i][j-2]
      2. * 匹配一次或多次:如果当前字符与模式中的字符匹配(或者模式中的字符是 .),那么可以继续检查 dp[i-1][j]

代码

C++

#include <iostream>
#include <vector>
#include <string>
using namespace std;bool check(const string& s, const string& p) {int sl = s.size(), pl = p.size();// dp[i][j] 表示字符串 s 的前 i 个字符是否与模式 p 的前 j 个字符匹配。vector<vector<bool>> dp(sl + 1, vector<bool>(pl + 1, false));dp[0][0] = true;// 需要检查 x* 前面的部分是否能匹配空字符串。for (int j = 1; j <= pl; ++j) {if (p[j - 1] == '*') {dp[0][j] = dp[0][j - 2];}}for (int i = 1; i <= sl; ++i) {for (int j = 1; j <= pl; ++j) {if (p[j - 1] == s[i - 1] || p[j - 1] == '.') {dp[i][j] = dp[i - 1][j - 1];}else if (p[j - 1] == '*') {dp[i][j] = dp[i][j - 2] || (dp[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.'));}}}return dp[sl][pl];
}int main() {// 输入字符串数组vector<string> strings;string input;getline(cin, input);size_t pos = 0;while ((pos = input.find(' ')) != string::npos) {strings.push_back(input.substr(0, pos));input.erase(0, pos + 1);}strings.push_back(input); // 添加最后一个字符串// 输入字符规律string pattern;getline(cin, pattern);// 查找匹配的下标vector<int> res;for (int i = 0; i < strings.size(); i++) {if (check(strings[i], pattern)) {res.push_back(i);}}if (res.empty()) {cout << -1 << endl;}else {for (int i = 0; i < res.size(); ++i) {cout << res[i];if (i < res.size() - 1) {cout << ",";}}cout << endl;}return 0;
}

python

re模块一步出结果

import redef find_matching_indices(strings, pattern):indices = []for i, s in enumerate(strings):if re.fullmatch(pattern, s):indices.append(i)return indicesstrings = input().split()
pattern = input()
matching_indices = find_matching_indices(strings, pattern)if not matching_indices:print(-1)
else:print(",".join(map(str, matching_indices)))

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

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

相关文章

AI智慧社区--Excel表的导入导出

Excel表导入导出的环境配置 1.导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>${easypoi.version}</version></dependency>2.配置Excel的导入导出以及…

【C++】B2122 单词翻转

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 &#x1f4af;一、我的做法代码实现&#xff1a;代码解析思路分析 &#x1f4af;二、老师的第一种做法代码实现&a…

【流媒体】搭建流媒体服务器

搭建Windows Nginx服务器 搭建 下载nginx工具包解压至本地&#xff0c;并在cmd窗口中切换至nginx所在的本地目录修改 conf/nginx.conf 文件&#xff0c;更改其端口号 server中的 listen的端口号从 80改为 8080&#xff0c;因为80经常被其他服务占用&#xff0c;导致无法打开 …

编程AI深度实战:给vim装上AI

系列文章&#xff1a; 编程AI深度实战&#xff1a;私有模型deep seek r1&#xff0c;必会ollama-CSDN博客 编程AI深度实战&#xff1a;自己的AI&#xff0c;必会LangChain-CSDN博客 编程AI深度实战&#xff1a;给vim装上AI-CSDN博客 编程AI深度实战&#xff1a;火的编程AI&…

MySQL锁详解

MySQL锁详解 数据库的锁机制锁的分类行级锁与表级锁行级锁之共享锁与排他锁乐观锁与悲观锁悲观锁乐观锁 Innodb存储引擎的锁机制行级锁与表级锁的使用区分三种行锁的算法死锁的问题多版本并发控制MVCC 数据库的锁机制 什么是锁&#xff1f;锁是一种保障数据的机制 为何要用锁…

100 ,【8】 buuctf web [蓝帽杯 2021]One Pointer PHP(别看)

进入靶场 没提示&#xff0c;去看源代码。 user.php <?php // 定义一个名为 User 的类&#xff0c;该类可用于表示用户相关信息或执行与用户有关的操作 class User{// 声明一个公共属性 $count&#xff0c;可在类的内部和外部直接访问// 这个属性可能用于记录与用户相关…

【leetcode练习·二叉树拓展】归并排序详解及应用

本文参考labuladong算法笔记[拓展&#xff1a;归并排序详解及应用 | labuladong 的算法笔记] “归并排序就是二叉树的后序遍历”——labuladong 就说归并排序吧&#xff0c;如果给你看代码&#xff0c;让你脑补一下归并排序的过程&#xff0c;你脑子里会出现什么场景&#xff…

解决PyG安装中torch-sparse安装失败问题:详细指南

1 问题描述 最近在学习GNN&#xff0c;需要使用PyTorch Geometric&#xff08;PyG&#xff09;库。在安装PyG的过程中&#xff0c;遇到了torch-sparse安装失败的问题&#xff0c;错误提示为&#xff1a; ERROR: Failed building wheel for torch-sparse本文将详细记录问题的解…

四、GPIO中断实现按键功能

4.1 GPIO简介 输入输出&#xff08;I/O&#xff09;是一个非常重要的概念。I/O泛指所有类型的输入输出端口&#xff0c;包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO&#xff08;General-Purpose Input/Output&#xff09;则是一个常见的术语&#xff0c…

分析哲学:从 语言解剖到 思想澄清的哲学探险

分析哲学&#xff1a;从 语言解剖 到 思想澄清 的哲学探险 第一节&#xff1a;分析哲学的基本概念与公式解释 【通俗讲解&#xff0c;打比方来讲解&#xff01;】 分析哲学&#xff0c;就像一位 “语言侦探”&#xff0c;专注于 “解剖语言”&#xff0c;揭示我们日常使用的语…

XCCL、NCCL、HCCL通信库

XCCL提供的基本能力 XCCL提供的基本能力 不同的XCCL 针对不同的网络拓扑&#xff0c;实现的是不同的优化算法的&#xff08;不同CCL库最大的区别就是这&#xff09; 不同CCL库还会根据自己的硬件、系统&#xff0c;在底层上面对一些相对应的改动&#xff1b; 但是对上的API接口…

【数据结构篇】时间复杂度

一.数据结构前言 1.1 数据结构的概念 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结构&#xff0c; 如&#xff1a…

700. 二叉搜索树中的搜索

二叉搜索树中的搜索 已解答 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3], v…

Spring Cloud工程搭建

目录 工程搭建 搭建父子工程 创建父工程 Spring Cloud版本 创建子项目-订单服务 声明项⽬依赖 和 项⽬构建插件 创建子项目-商品服务 声明项⽬依赖 和 项⽬构建插件 工程搭建 因为拆分成了微服务&#xff0c;所以要拆分出多个项目&#xff0c;但是IDEA只能一个窗口有一…

Rust中使用ORM框架diesel报错问题

1 起初环境没有问题&#xff1a;在Rust开发的时候起初使用的是mingw64平台加stable-x86_64-pc-windows-gnu编译链&#xff0c;当使用到diesel时会报错&#xff0c;如下&#xff1a; x86_64-w64-mingw32/bin/ld.exe: cannot find -lmysql具体信息很长这是主要信息是rust找不到链…

【C++】P1765 手机

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;问题描述题目内容示例&#xff1a; 键盘布局 &#x1f4af;我的做法思路问题与优化我的代码实现分析与问题 &#x1f4af;老师的做法思路老师的代码实现分析优点 &#x1f…

本地快速部署DeepSeek-R1模型——2025新年贺岁

一晃年初六了&#xff0c;春节长假余额马上归零了。今天下午在我的电脑上成功部署了DeepSeek-R1模型&#xff0c;抽个时间和大家简单分享一下过程&#xff1a; 概述 DeepSeek模型 是一家由中国知名量化私募巨头幻方量化创立的人工智能公司&#xff0c;致力于开发高效、高性能…

3 卷积神经网络CNN

1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron&#xff0c;可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…

QT交叉编译环境搭建(Cmake和qmake)

介绍一共有两种方法&#xff08;基于qmake和cmake&#xff09;&#xff1a; 1.直接调用虚拟机中的交叉编译工具编译 2.在QT中新建编译套件kits camke和qmake的区别&#xff1a;CMake 和 qmake 都是自动化构建工具&#xff0c;用于简化构建过程&#xff0c;管理编译设置&…

STM32 对射式红外传感器配置

这次用的是STM32F103的开发板&#xff08;这里面的exti.c文件没有how to use this driver 配置说明&#xff09; 对射式红外传感器 由一个红外发光二极管和NPN光电三极管组成&#xff0c;M3固定安装孔&#xff0c;有输出状态指示灯&#xff0c;输出高电平灯灭&#xff0c;输出…