leetcode 面试经典 150 题:单词规律

链接单词规律
题序号290
题型字符串
解题方法哈希表
难度简单
熟练度✅✅✅

题目

  • 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

  • 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。

  • 示例1:
    输入: pattern = “abba”, s = “dog cat cat dog”
    输出: true

  • 示例 2:
    输入:pattern = “abba”, s = “dog cat cat fish”
    输出: false

  • 示例 3:
    输入: pattern = “aaaa”, s = “dog cat cat dog”
    输出: false

  • 提示:
    1 <= pattern.length <= 300
    pattern 只包含小写英文字母
    1 <= s.length <= 3000
    s 只包含小写英文字母和 ’ ’
    s 不包含 任何前导或尾随对空格
    s 中每个单词都被 单个空格 分隔

题解

  1. 核心要点

    • 使用两个哈希表来存储 pattern 中的字符到 s 中的单词的映射关系,以及 s 中的单词到 pattern 中的字符的映射关系。
    • 遍历 pattern 和 s,检查每个字符和单词的映射关系是否一致。
    • 如果在遍历过程中发现映射关系不一致,则返回 false。
    • 如果遍历结束后没有发现不一致的映射关系,则返回 true。
  2. 复杂度:时间复杂度和空间复杂度都是O(n+m)。

  3. c++ 实现算法

bool wordPattern(string pattern, string s) {unordered_map<char, string> charToWord; // 保存 pattern 中字符到单词的映射unordered_map<string, char> wordToChar; // 保存单词到 pattern 中字符的映射istringstream ss(s); // 将字符串 s 转换为输入流string word;int i = 0;//ss>>word 从字符串流中读取一个单词放到 wordwhile (ss >> word) {if (i >= pattern.size()) return false; // 单词数量多于 pattern 字符数量char c = pattern[i]; //从 pattern 中取出当前索引 i 对应的字符,赋值给变量 c// 检查 pattern->word 的映射if (charToWord.count(c)) { // 如果当前 pattern 字符已经有映射if (charToWord[c] != word) return false; // 如果映射不一致,返回 false} else {charToWord[c] = word; //如果不存在映射,则将当前单词和字符添加到 wordToChar 中}// 检查 word->pattern 的映射,过程同理if (wordToChar.count(word)) {if (wordToChar[word] != c) return false;} else {wordToChar[word] = c;}i++;}return i == pattern.size(); // 确保没有多余的模式字符
}
  1. 推演算法

示例 1

  • 输入:
    pattern = “abba” s = “dog cat cat dog”

  • 执行过程:
    第一次迭代:
    当前单词:“dog”
    当前字符:‘a’
    wordToChar.count(“dog”) = 0(单词未映射)
    添加映射:wordToChar[“dog”] = ‘a’
    第二次迭代:
    当前单词:“cat”
    当前字符:‘b’
    wordToChar.count(“cat”) = 0(单词未映射)
    添加映射:wordToChar[“cat”] = ‘b’
    第三次迭代:
    当前单词:“cat”
    当前字符:‘b’
    wordToChar.count(“cat”) = 1(单词已映射)
    检查映射:wordToChar[“cat”] == ‘b’,映射一致,继续。
    第四次迭代:
    当前单词:“dog”
    当前字符:‘a’
    wordToChar.count(“dog”) = 1(单词已映射)
    检查映射:wordToChar[“dog”] == ‘a’,映射一致,继续。

  • 结果: 映射通过,返回 true。

示例 2

  • 输入:
    pattern = “abba” s = “dog cat cat fish”

  • 步骤 1:
    初始化 charToWord = {} wordToChar = {} istringstream 分割 s 为单词流 [“dog”, “cat”, “cat”, “fish”]。
    i = 0

  • 步骤 2:
    遍历模式和单词
    第 1 次迭代 当前模式字符:‘a’ 当前单词:“dog” 建立映射: ‘a’ -> “dog” “dog” -> ‘a’
    第 2 次迭代 当前模式字符:‘b’ 当前单词:“cat” 建立映射: ‘b’ -> “cat” “cat” -> ‘b’
    第 3 次迭代 当前模式字符:‘b’ 当前单词:“cat” 检查映射: ‘b’ 映射为 “cat”,一致。 “cat” 映射为
    ‘b’,一致。
    第 4 次迭代 当前模式字符:‘a’ 当前单词:“fish” 检查映射: ‘a’ 映射为 “dog”,但当前单词是 “fish” →
    不一致。

  • 步骤 3:
    返回结果 映射不一致,返回 false。

  1. c++ 完整demo
#include <iostream>
#include <unordered_map>
#include <sstream>
using namespace std;bool wordPattern(string pattern, string s) {unordered_map<char, string> charToWord; // 保存 pattern 中字符到单词的映射unordered_map<string, char> wordToChar; // 保存单词到 pattern 中字符的映射istringstream ss(s); // 将字符串 s 转换为输入流string word;int i = 0;//ss>>word 从字符串流中读取一个单词放到 wordwhile (ss >> word) {if (i >= pattern.size()) return false; // 单词数量多于 pattern 字符数量char c = pattern[i]; //从 pattern 中取出当前索引 i 对应的字符,赋值给变量 c// 检查 pattern->word 的映射if (charToWord.count(c)) { // 如果当前 pattern 字符已经有映射if (charToWord[c] != word) return false; // 如果映射不一致,返回 false} else {charToWord[c] = word; //如果不存在映射,则将当前单词和字符添加到 wordToChar 中}// 检查 word->pattern 的映射,过程同理if (wordToChar.count(word)) {if (wordToChar[word] != c) return false;} else {wordToChar[word] = c;}i++;}return i == pattern.size(); // 确保没有多余的模式字符
}int main() {string pattern = "abba";string s = "dog cat cat dog";if (wordPattern(pattern, s)) {cout << "True" << endl;} else {cout << "False" << endl;}return 0;
}

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

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

相关文章

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…

Hadoop3.x 万字解析,从入门到剖析源码

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

RabbitMQ介绍与使用

RabbitMQ官网 RabbitMQ 介绍 RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;基于 AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;使用 Erlang 编程语言构建。它是消息队列&#xff08;MQ&#xff09;的一种&#xff0c;广泛应用于分布式系统中&#x…

【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息

源码链接&#xff1a; https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL&#xff0c;程序将自动抓取网页内容 二、技术选型与原理 requests 库&#xff1a;这是 Python 中用于发送 HTTP 请求…

混合专家模型 (MoE)笔记摘要

ref&#xff1a; https://huggingface.co/blog/zh/moe#%E4%BB%80%E4%B9%88%E6%98%AF%E6%B7%B7%E5%90%88%E4%B8%93%E5%AE%B6%E6%A8%A1%E5%9E%8B 简短总结 混合专家模型 (MoEs): 与稠密模型相比&#xff0c; 预训练速度更快 与具有相同参数数量的模型相比&#xff0c;具有更快的…

解决idea中无法拖动tab标签页的问题

1、按 Ctrl Alt S 打开设置&#xff0c;找到路径 File | Settings | Appearance & Behavior | Appearance 2、去掉勾选 Drag-and-drop with Alt pressed only 即可

六、Angular 发送请求/ HttpClient 模块

一、应用 HttpClient 模块 angular/common/http 中的 HttpClient 类基于浏览器提供的 XMLHttpRequest 接口。要想使用 HtpClient 模块&#xff0c;就要先导入 Anqular 的 HttpClientModule。大多数 Web 应用程序都会在根模块 AppModule 中导入它。 编辑 src/app/app.module.ts…

基于单片机的无线智能窗帘控制器的设计

摘 要 : 本文以单片机为控制核心 , 基于 PT2262/ 2272 无线收发模块 , 实现了窗帘的无线远程智能控制 . 该控制器通过高频无线收发模块实现了遥控窗帘的开合控制; 根据外部光线强弱实现自动开关窗帘 ; 根据设定时间自动完成开关过程; 通过语音播报当前环境温湿度信息以…

android刷机

android ota和img包下载地址&#xff1a; https://developers.google.com/android/images?hlzh-cn android启动过程 线刷 格式&#xff1a;ota格式 模式&#xff1a;recovery 优点&#xff1a;方便、简单&#xff0c;刷机方法通用&#xff0c;不会破坏手机底层数据&#xff0…

Vivado中Tri_mode_ethernet_mac的时序约束、分析、调整——(一)时序约束的基本概念

1、基本概念 推荐阅读&#xff0c;Ally Zhou编写的《Vivado使用误区与进阶》系列文章&#xff0c;熟悉基本概念、tcl语句的使用。 《Vivado使用误区与进阶》电子书开放下载&#xff01;&#xff01; 2、Vivado中的语法例程 1&#xff09;语法例程 约束的语句可以参考vivado…

设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许将请求沿着处理者链进行发送。每个处理者对象都有机会处理该请求&#xff0c;直到某个处理者决定处理该请求为止。这种模式的主要目的是避免请求的发送者和接收者之间…

ubuntu 20.04 安装docker--小白学习之路

更新包 sudo apt-get update # 安装需要的软件包以使apt能够通过HTTPS使用仓库 sudo apt-get install ca-certificates curl gnupg lsb-release 使用清华大学源 # 添加Docker官方的GPG密钥 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo…

Linux之线程池与单例模式

目录 线程池 线程池代码 单例模式 饿汉模式单例模式 懒汉模式单例模式 在前几期&#xff0c;我们已经学习了多线程的创建和控制&#xff0c;学习了多线程中的同步和互斥&#xff0c;学习了多线程中的条件变量和信号量&#xff0c;基于此我们实现了基于阻塞队列和基于环形队…

The Dedicated Few (10 player)

The Dedicated Few (10 player) 少数精锐&#xff08;10人&#xff09; &#xff1a;以少于9人的阵容击败纳克萨玛斯的所有首领&#xff08;10人&#xff09; 历时2小时做完了&#xff0c;不容易啊&#xff0c;别人可以的咱也可以。 World of Warcraft [CLASSIC][80猎人][G…

List ---- 模拟实现LIST功能的发现

目录 listlist概念 list 中的迭代器list迭代器知识const迭代器写法list访问自定义类型 附录代码 list list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素…

vscode支持ssh远程开发

文章目录 一、生成ssh使用的公钥/密钥对二、使用vscode通过ssh连接服务器1.安装插件2.配置文件3.连接服务器4.新建文件夹&#xff0c;存放不同的任务 三、使用scp命令与服务器互传文件、文件夹1.检查Windows 系统是否支持scp命令2.在Windows系统本地的电脑向服务器传输文件、文…

Jmeter-压测时接口如何按照顺序执行

Jmeter-压测时接口如何按照顺序执行-临界部分控制器 在进行压力测试时&#xff0c;需要按照顺序进行压测&#xff0c;比如按照接口1、接口2、接口3、接口4 进行执行 查询结果是很混乱的&#xff0c;如果请求次数少&#xff0c;可能会按照顺序执行&#xff0c;但是随着次数增加…

day02-前端Web-JavaScript

目录 1. JS介绍2. 引入方式2.1 介绍2.2 演示 3. 基础语法3.1 书写规范3.2 变量3.2.1 let3.2.2 const3.2.3 注意 3.3 数据类型3.4 运算符3.4.1 运算符3.4.2 类型转换 3.5 流程控制语句 4. 函数4.1 格式一4.2 格式二 5. JS对象5.1 基本对象5.1.1 Array对象5.1.1.1 语法格式5.1.1.…

有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗

近期&#xff0c;有多名开发者反馈&#xff0c;收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞&#xff0c;写给AppStore的投诉邮件。 邮件内容主要说的是&#xff0c;腾讯注册了【水印相机】这四个字的商标&#xff0c;所以你们这些在AppStore上的app&…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告&#xff0c;需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看