面试经典150题——单词规律

"Don't wait. The time will never be just right." - Napoleon Hill

snow covered mountain under blue sky

1. 题目描述

2.  题目分析与解析

首先还是得把题目先读懂,我们直接来看看示例:

根据上面的示例,我们可以看出pattern其实就是表示单词出现的规律,每一种pattern中的字符表示一个单词。

就比如上面的示例一:

pattern="abba",对应于s,就可以发现 a = dogb = cat,这样pattern(abba)实际上就是对应了

(a=)dog(b=)cat(b=)cat(a=)dog

而这种映射关系是不可更改的,比如看示例二,开始a对应dog,b对应cat,但是当我们走到pattern的最后一个字符发现a等于 fish,而之前我们已经将 a=dog,所以此时映射失败就返回false。

2.1 思路一——hash映射表

根据上面的读题以及上一篇文章,我想大家应该能很快想出来其实还是映射关系,映射怎么办?那就用一个hashMap解决呗。尝试将pattern中的字符不断向映射表中存放,其实和上一篇文章基本数一摸一样,

  • 当发现pattern中某一个字符在映射表中不存在,就将该字符作为键,对应的s中的单词作为值,放入映射表。

  • 当发现pattern中某一个字符在映射表中存在,查看对应的值是否与s中对应位置的单词匹配,匹配成功继续匹配,匹配失败则返回false。

  • 当走完整个pattern,都没返回false,那么就说明映射成功!

  • 但是我们需要先把s字符串按照空格切割成单词

    //2. 将字符串s按空格分割成字符串数组String[] words = s.split(" ");

这就造成了大量的额外空间的浪。

2.2 思路二——优化

由于在思路一将字符串s按空格分割成字符串数组String[] words = s.split(" ");浪费了一个和s接近一样大小的字符串数组,我们想一下怎么把这部分空间优化掉。

我们之所有将s字符串分割,就是因为我们向方便后续根据pattern的第几个字符就可以找到words中对应的第几个单词。

如果不使用额外的数组空间,我们就得想办法找到pattern字符对应的位置的单词。但是注意我要找的单词不是乱序的,是从前往后找的,pattern从第一个字符走到最后一个字符,对应s中的单词也是从第一个单词走到最后一个单词(先不考虑s中单词数量和pattern中字符数不相等的情况,因为如果不相等的话把短的那个遍历结束发现另外一个没遍历完就可以直接返回false)。

而且题目也告诉我们:

  • s 中每个单词都被 单个空格 分隔

  • s 不包含 任何前导或尾随对空格

所以如果要截取对应的单词,只需要指定两个指针,来截取对应位置的单词就可以了。

所以整体思路同思路一,只不过在使用words[i]时我们使用一个双指针,用来截取单词,减少额外的空间开销。(代码有注释)

但是我们需要注意:

  • 我们需要考虑某一个先遍历完的情况,因为任何一个先遍历完(我指的是映射),就需要返回false,比如下图:

3. 代码实现

3.1 思路一——hash映射表

3.2 思路二——优化空间

4. 相关复杂度分析

思路一:使用split方法

  • 时间复杂度

    • 分割字符串sO(M),其中M是字符串s的长度。

    • 遍历pattern字符串:O(N),其中Npattern的长度(同时也是分割后的单词数组的长度)。

    • 每次迭代中检查映射关系:O(1)平均时间复杂度,但包含对containsValue的调用,这在最坏情况下的时间复杂度为O(k)k是映射中的元素数量。

    • 综合时间复杂度:O(M + Nk),这里假设k在最坏情况下与N相等。

  • 空间复杂度

    • 存储单词数组:O(M),因为需要存储分割后的单词。

    • 使用HashMap存储映射:O(N),在最坏情况下,每个字符映射一个唯一的单词。

    • 综合空间复杂度:O(M + N)

思路二:使用双指针法

  • 时间复杂度

    • 直接在s上使用双指针寻找单词,避免了split的使用:O(M),其中M是字符串s的长度。

    • 遍历patternO(N),其中Npattern的长度。

    • 检查映射关系的时间复杂度与思路一相同,因此综合时间复杂度为:O(M + Nk)

  • 空间复杂度

    • 不需要存储单词数组,直接在s上操作:O(1)额外空间(不计入输出结果的空间)。

    • 使用HashMap存储映射:O(N),在最坏情况下,每个字符映射一个唯一的单词。

    • 综合空间复杂度:O(N)

总结

第一种方法在空间复杂度上会稍高一些,因为它需要存储分割后的单词数组。

第二种方法在处理大文本时可能更优,因为它直接在原字符串上操作,避免了额外的存储开销。

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

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

相关文章

Linux中alarm/setitimer函数(信号函数)

alarm函数 函数原型: unsigned int alarm(unsigned int seconds); 函数描述:设置定时器(闹钟)。在指定seconds后,内核会给当前进程发送 14)SIGALRM信号。进程收到该信号,默认动作终止。每个进程…

git工具

一、命令行工具 二、Git 客户端可视化工具-推荐 1.常用工具 tortoisegit 官网 https://tortoisegit.org/ 推荐 sourcetree 官网https://www.sourcetreeapp.com/ 2.tortoisegit安装 2.1 下载安装包 2.2 下载语言包 2.3 安装 2.4 安装语言包 5.使用 5.1 新建分支 5.2 切换分支…

python基础教程—总结篇

这篇是Python基础教程系列的总结篇,这里这个专栏的地址:《Python教程》 首先必须声明一点,这是基础教程,所以面向的是新人,没有学过Python的同学,所以这套教程并没有涉及到比较难的并发编程模块&#xff0…

数字世界的探索者:计算机相关专业电影精选推荐

目录 推荐计算机专业必看的几部电影 《黑客帝国》 《社交网络》 《乔布斯传》 《心灵捕手》 《源代码》 《盗梦空间》 《头号玩家》 《我是谁:没有绝对安全的系统》 《战争游戏》(WarGames) 《模仿游戏》(The Imitation Game) 《硅谷》(Silicon Valley) …

qt_day3

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置账户和密码的登录标签ui->lab1->setPixmap(QPixmap(":/pictrue/wodepeizhenshi.png"));…

51_蓝桥杯_独立按键

一 电路 注意:J5跳帽接到2~3引脚,使按键S4-S5四个按键的另外一端接地,从而成为4个独立按键。 二 独立按键工作原理 三 代码 代码1:按下S7点亮L1指示灯,松开按键,指示灯熄灭,按下S6点亮L2指示灯…

电流回路是分析电路图的基础,看看这个电路你会更明白

任何电器要想开始工作,都离不开供电,而要供电就离不开电源。电源有两个极即:电源正极()、电源负极(-),电源要实现向负载供电,必须是电源正极()流出电流经负载再流回电源负极(-),这时可以说这个电路构成了供电电流回路了…

阿里云幻兽帕鲁服务器续费还有优惠吗?老用户续费的价格很贵怎么办?

最近很多人在问,上个月买的阿里云幻兽帕鲁服务器续费是不是没有优惠了,因为他们发现续费的价格比之前贵了很多,之前是不到30元一个月。 其实目前的续费优惠是有的,有但不多,方法就是进入阿里云服务器ECS控制台&#x…

设计模式四:适配器模式

1、适配器模式的理解 适配器模式可以理解为有两个现成的类Adaptee和Target,它们两个是不能动的,要求必须使用B这个类来实现一个功能,但是A的内容是能复用的,这个时候我们需要编写一个转换器 适配器模式 Adaptee:被适…

【C++初阶】类和对象(上)

目录 一.类的引入 1.概念 2.类的定义 (1).语法规范 (2)命名规范 (3)类的访问限定符及封装 ①访问限定符 (4)类的两种定义 ①声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。 ​编辑…

【IDEA使用安装】如何长期正常使用IDEA,告别弹窗?【2024年亲测】

IDEA最新使用指南 写在前面涉及知识1、官网下载最新版本IDEA2、安装IDEA版本3、正常使用IDEA软件4、作者寄语 写在前面 愉快的假期结束了,当然我们奋斗的步伐不能停止,随即迎来了2024年的全新挑战,学更多的知识,分享更多有用的硬…

langchain配置openai

langchain的新版很多操作都变了,国内使用openai也不大方便,好在发现了个宝藏网站,可以使用 网址,接口的调用与官网是完全一样的 langchain调用各种大模型非常方便,也不用担心接口经常变动,导致和gradio等程…

【Flink状态管理五】Checkpoint的设计与实现

文章目录 1. Checkpoint的整体设计2. Checkpoint创建源码解析2.1. DefaultExecutionGraphBuilder.buildGraph2.2. ExecutionGraph.enableCheckpointing 由于系统原因导致Flink作业无法正常运行的情况非常多,且很多时候都是无法避免的。对于Flink集群来讲&#xff0c…

opencv图像处理(一)

一. OpenCV 简介 OpenCV 是一个跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 应用领域 1、人机互动 2、物体识别 3、图像分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、…

整数分块 (因数平方和)(余数之和)

整数分块 文章目录 整数分块例题1:因数平方和分析:具体代码:__int128写法逆元写法 例题2:余数之和思想:代码 一般在算法中遇到时间复杂度为1e9的, 那么一次 O ( n ) O(n) O(n)的遍历无法解决问题 求 ∑ i 1 n [ n i ]…

3.网络游戏逆向分析与漏洞攻防-游戏启动流程漏洞-游戏启动流程的分析

内容参考于:易道云信息技术研究院VIP课 上一个内容:项目搭建 首先下图红框里是游戏启动的程序 游戏启动之后的名字(fxgame.exe) 一般游戏启动的架构: 第一种:登录器程序启动游戏主程序,然后游…

java面向对象上:类的结构之一

目录 1.相同点 2.不同点 2.1 在类中声明的位置的不同 2.2 关于权限修饰符的不同 2.3 默认初始化值的情况: 2.4 在内存中加载的位置 补充:回顾变量的分类: 方式一:按照数据类型: 方式二:按照在类中…

【Flutter】底部导航BottomNavigationBar的使用

常用基本属性 属性名含义是否必须items底部导航栏的子项List是currentIndex当前显示索引否onTap底部导航栏的点击事件, Function(int)否type底部导航栏类型,定义 [BottomNavigationBar] 的布局和行为否selectedItemColor选中项图标和label的颜色否unsel…

工业网关的功能和优势,以及如何选择合适的工业网关-天拓四方

工业网关是连接各种工业设备和系统的通信设备,可以实现不同设备和系统之间的数据交换和通信。它可以作为一个中心节点,将各种工业设备连接起来,形成一个统一的通信网络,从而实现设备的远程监控、数据采集、分析和控制等功能。在工…

抖音小店新手应该怎么做?4个必须掌握的运营步骤,助你快速入门

大家好,我是电商花花。 很多新手在刚开始接触电商,接触抖音小店的时候都会感到迷茫吗,不知所措,新店刚开始都是从没有流量,没有销量,没有订单走过来的,我们也是。 新手做店都是需要方法&#…