LeetCode 面试题 16.18. 模式匹配

文章目录

  • 一、题目
  • 二、C# 题解

一、题目

  你有两个字符串,即 patternvaluepattern 字符串由字母 "a""b" 组成,用于描述字符串中的模式。例如,字符串 "catcatgocatgo" 匹配模式 "aabab"(其中 "cat""a""go""b"),该字符串也匹配像 "a""ab""b" 这样的模式。但需注意 "a""b" 不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。

示例 1:

输入: pattern = “abba”, value = “dogcatcatdog”
输出: true

示例 2:

输入: pattern = “abba”, value = “dogcatcatfish”
输出: false

示例 3:

输入: pattern = “aaaa”, value = “dogcatcatdog”
输出: false

示例 4:

输入: pattern = “abba”, value = “dogdogdogdog”
输出: true
解释: “a”=“dogdog”,b=“”,反之也符合规则

提示:

  • 1 <= len(pattern) <= 1000
  • 0 <= len(value) <= 1000
  • 你可以假设 pattern 只包含字母 "a""b"value 仅包含小写字母。

  点击此处跳转题目。

二、C# 题解

  1. 判断长度是否满足要求。
    即判断是否存在一对 (aStr, bStr),使得 aLen * aNum + bLen * bNum = value.Length。其中

    • aStr / bStr 分别为 a / b 匹配的字符串。
    • aLen / bLen 分别为 aStr / bStr 的长度。
    • aNum / bNum 分别为 pattern 中 a / b 的个数。
  2. 对于所有的有序对 (aStr, bStr),顺序取 pattern 中的每个字符,判断 value 对应位置是否匹配。

  代码中用 lens 存储所有的有序对 (aStr, bStr)

public class Solution {public bool PatternMatching(string pattern, string value) {int n    = pattern.Length, l = value.Length;   // pattern 长度int aNum = pattern.Sum(a => a == 'a' ? 1 : 0); // pattern 中 a 的个数int bNum = n - aNum;                           // pattern 中 b 的个数List<int[]> lens = new List<int[]>(); // lens[i][0]/lens[i][1] 分别为 a/b 匹配的字符串长度if (aNum == 0) {if (l % bNum != 0) return false;lens.Add(new[] { 0, l / bNum });}else if (bNum == 0) {if (l % aNum != 0) return false;lens.Add(new[] { l / aNum, 0 });}elsefor (int i = 0; i <= l / aNum; i++)if ((l - i * aNum) % bNum == 0)lens.Add(new[] { i, (l - i * aNum) / bNum });foreach (var len in lens) {           // 每种 a/b 对应的长度都试一遍bool      ans   = true;           // 记录该种长度下是否匹配成功string?[] abStr = { null, null }; // 记录 a/b 对应匹配的字符串int       index = 0;              // 当前 value 中的匹配位置for (int j = 0; j < pattern.Length; j++) {int    ab    = pattern[j] - 'a';              // 1 表示 a,2 表示 bint    abLen = len[ab];                       // 取出 a_b 对应的匹配字符串长度string sub   = value.Substring(index, abLen); // 查看 value 中的字符串index += abLen;                               // 更新位置if (abStr[ab] == null) {                      // 之前未出现,则用 abStr 记录下来if (abStr[1 - ab] == sub) return false;   // 如果和另一个字符匹配的字符串一样,则返回 falseabStr[ab] = sub;}else if (abStr[ab] != sub) { // 匹配失败ans = false;             // 该情况返回 falsebreak;}}if (ans) return true; // 如果该情况匹配成功,直接返回 true}return false;}
}
  • 时间:68 ms,击败 66.67% 使用 C# 的用户
  • 内存:36.72 MB,击败 33.33% 使用 C# 的用户

  优化掉 lens 后,可以提升效率:

public class Solution {public bool PatternMatching(string pattern, string value) {int n    = pattern.Length, l = value.Length;   // pattern 长度int aNum = pattern.Sum(a => a == 'a' ? 1 : 0); // pattern 中 a 的个数int bNum = n - aNum;                           // pattern 中 b 的个数if (aNum == 0) return Repeat(value, bNum);if (bNum == 0) return Repeat(value, aNum);for (int aLen = 0; aLen <= l / aNum; aLen++) {if ((l - aLen * aNum) % bNum != 0) continue;int       bLen  = (l - aLen * aNum) / bNum;string?[] abStr = { null, null };int       index = 0;bool      ans   = true;for (var i = 0; i < pattern.Length; i++) {int    ab    = pattern[i] - 'a';int    abLen = ab == 0 ? aLen : bLen;string sub   = value.Substring(index, abLen);index += abLen;if (abStr[ab] == null) {                    if (abStr[1 - ab] == sub) return false; abStr[ab] = sub;}else if (abStr[ab] != sub) { ans = false;             break;}}if (ans) return true;}return false;}// 判断 value 是否重复 n 次public bool Repeat(string value, int n) {if (value.Length % n != 0) return false;int l = value.Length / n;for (int i = 0; i < l; i++)for (int j = 1; j < n; j++)if (value[(j - 1) * l + i] != value[j * l + i])return false;return true;}
}
  • 时间:60 ms,击败 100.00% 使用 C# 的用户
  • 内存:36.51 MB,击败 66.67% 使用 C# 的用户

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

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

相关文章

ubuntu18.04 多版本opencv配置记录

多版本OpenCV过程记录 环境 ubuntu18.04 python2.7 python3.6 python3.9 opencv 3.2 OpenCV 4.4.0安装 Ubuntu18.04 安装 Opencv4.4.0 及 Contrib (亲测有效) 暂时不清楚Contrib的作用&#xff0c;所以没安装&#xff0c;只安装最基础的 下载opencv4.4.0并解压 opencv下载…

10 路由协议:西出网关无故人,敢问路在何方

1.网络包出了网关之后&#xff0c;就有了一种漂泊的悲凉感 2.之前的场景是比较简单的场景&#xff0c;但是在实际生产环境下&#xff0c;出了网关&#xff0c;会面临着很多路由器&#xff0c;有很多条道路可以选。 3、如何配置路由&#xff1f; 路由表的设计 1.路由器就是一…

【计算文献解读】ACS Catal.:塑料垃圾回收利用中的均相催化

合理的塑料回收对于解决与塑料垃圾相关的环境挑战至关重要&#xff0c;而在各种回收方法中&#xff0c;化学回收&#xff0c;特别是通过均相催化&#xff0c;有望将塑料垃圾转化为有价值的产品。由于聚烯烃链的结构不均匀性和功能化&#xff0c;聚合物废物对催化循环提出了挑战…

【NLP】python-docx库简介

python-docx是一个word稳定读取、创建、编辑报错的Python 库&#xff0c;注意仅支持Microsoft Word 2007 (.docx) 文件。 目录 &#x1f353;&#x1f353;安装 &#x1f353;&#x1f353;应用举例 &#x1f514;&#x1f514;python代码1 &#x1f514;&#x1f514;输出…

计算机网络第4章-IPv6和寻址

IP地址的分配 为了获取一块IP地址用于一个组织的子网内&#xff0c;于是我们向ISP联系&#xff0c;ISP则会从已分给我们的更大 地址块中提供一些地址。 例如&#xff0c;ISP也许已经分配了地址块200.23.16.0/20。 该ISP可以依次将该地址块分成8个长度相等的连续地址块&…

【蓝桥杯 第十四届省赛Java B组】真题训练(A - E)正在更新

目录 A、阶乘求和 - BigInteger B、幸运数字 - 字符串 进制转换 暴力大法 C、数组分割 - 数学思维 乘法排列组合 D、矩形总面积 - 推导公式 找规律 &#xff08;1&#xff09;暴力大法好 50% &#xff08;2&#xff09;正解 100% E、蜗牛 - &#xff08;我以为是模拟…

java八股文(mysql篇)

什么是关系型数据库&#xff1f; 其是建立在关系模型基础上的一种数据库&#xff0c;这种关系分为&#xff1a;一对一&#xff0c;一对多&#xff0c;多对多。 我们的数据存放在表中&#xff0c;在表中会有一至多个字段&#xff0c;一行就是一条数据。 mysql有哪些字段呢&…

CPU 飙高系统反应慢怎么排查

mic老师面试题摘选 面试过程中&#xff0c;场景类的问题更容易检测出一个开发人员的基本能力。 这不&#xff0c;一个小伙伴去阿里面试&#xff0c;第一面就遇到了关于“CPU 飙高系统反应慢怎么排查” 的问题&#xff1f; 对于这个问题&#xff0c;我们来看看普通人和高手…

【MySQL】用户管理权限控制

文章目录 前言一. 用户管理1. 创建用户2. 删除用户3. 修改用户密码 二. 权限控制1. 用户授权2. 查看权限3. 回收权限 结束语 前言 MySQL的数据其实也以文件形式保存&#xff0c;而登录信息同样保存在文件中 MySQL的数据在Linux下默认路径是/var/lib/mysql 登录MySQL同样也可以…

如何在macbook上删除文件?Mac删除文件的多种方法

在使用MacBook电脑时&#xff0c;桌面上经常会积累大量的文件&#xff0c;而这些文件可能已经不再需要或已经过时。为了保持桌面的整洁和提高电脑性能&#xff0c;我们需要及时删除这些文件。本文将介绍MacBook怎么删除桌面文件&#xff0c;以及macbook删除桌面文件快捷键。 一…

商品样式及详情

<!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1"><title>商品详情</title><link rel"stylesheet" href".…

C 语言左移位操作在kernel驱动子系统中的特殊用途

文章目录 前言一、C语言左移位操作介绍1. 左移位二、左移位操作在kernel 驱动子系统中的应用1. 左移位操作在 V4L2, Media 子系统中的应用实例2.左移位操作在 DRM 子系统中的应用实例2.1 左移位操作在struct drm_crtc 中的应用2.2 左移位操作在struct drm_encoder 中的应用总结…

Flutter 07 框架和三棵树(Widgets、Elements和RenderObjects)

一、Flutter框架的整体结构&#xff1a; Flutter是Google推出并开源的跨平台开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过Dart语 言开发Flutter应用&#xff0c;一套代码同时运行在ios和Android平台。不仅如此&#xff0c;Flutter还支持Web、桌面、嵌 入应…

日志门面技术

1.JCL public abstract class LogFactory {public static Log getLog(Class clazz) throws LogConfigurationException {// 默认实现类为LogFactoryImplreturn getFactory().getInstance(clazz);} }利用LogFactoryImpl实例化具体的日志框架。其中&#xff0c;如果存在log4j依赖…

【工具】OCR方法|不用下载额外的软件,提取扫描中英文PDF的目录文本的最优解!(一)

需求&#xff1a; 1&#xff09;从PDF里快速提取目录&#xff1b; 2&#xff09;不想下载任何软件。 我提取出来的目录文本会用于嵌入到PDF中&#xff0c;向PDF批量添加目录的软件以及软件的使用方法可以看我上一篇文章&#xff1a;PDF批量插入目录。 以下是我自己能想到的方…

问chatgpt最近生活的困难

你知道吗&#xff0c;因为我做的所有的事情没有任何目的性&#xff0c;所以曾经过的很好&#xff0c;这种很好是一种逃避式的好&#xff0c;怎么说呢&#xff1f;遇到困难了&#xff0c;那就不做了&#xff0c;换下一个项目。比如打游戏&#xff0c;如果我这局玩王者荣耀&#…

ubuntu 20.04无法连接网络,网线灯不亮,network-manager也启动不了

背景 系统编程只读的了&#xff0c;进入到initramfs模式&#xff0c;执行了下边语句&#xff0c;发现不小心把windows也给执行了&#xff0c;报错很多乱码&#xff0c;强制退出 执行 fsck -y /dev/sdb4 fsck -t ext4 /dev/sdb5 -y ## windows 时强制退出了导致很多文件损坏…

基于yolov2网络的人脸识别系统matlab仿真,包括识别正脸,侧脸等

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、训练阶段 4.2、预处理阶段 4.3、识别阶段 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................…

FastGPT | 3分钟构建属于自己的AI智能助手

这是一篇使用指南&#xff01;&#xff01;&#xff01; FastGPT是什么&#xff1f; FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&…

BEV-YOLO 论文学习

1. 解决了什么问题&#xff1f; 出于安全和导航的目的&#xff0c;自驾感知系统需要全面而迅速地理解周围的环境。目前主流的研究方向有两个&#xff1a;第一种传感器融合方案整合激光雷达、相机和毫米波雷达&#xff0c;和第二种纯视觉方案。传感器融合方案的感知表现鲁棒&am…