算法每日一题: 最大字符串匹配数目 | 哈希 | 哈希表 | 题意分析

hello 大家好,我是星恒
今天给大家带来的是hash,思路有好几种,需要注意的是这中简单的题目需要仔细看条件,往往他们有对应题目的特殊的解法

题目:leetcode 2744
给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。
如果字符串 words[i] 与字符串 words[j] 满足以下条件,我们称它们可以匹配:

  • 字符串 words[i] 等于 words[j] 的反转字符串。
  • 0 <= i < j < words.length

请你返回数组 words 中的 最大 匹配数目。
注意,每个字符串最多匹配一次。

示例:
示例 1:

输入:words = ["cd","ac","dc","ca","zz"]
输出:2
解释:在此示例中,我们可以通过以下方式匹配 2 对字符串:
- 我们将第 0 个字符串与第 2 个字符串匹配,因为 word[0] 的反转字符串是 "dc" 并且等于 words[2]。
- 我们将第 1 个字符串与第 3 个字符串匹配,因为 word[1] 的反转字符串是 "ca" 并且等于 words[3]。
可以证明最多匹配数目是 2 。

示例 2:

输入:words = ["ab","ba","cc"]
输出:1
解释:在此示例中,我们可以通过以下方式匹配 1 对字符串:
- 我们将第 0 个字符串与第 1 个字符串匹配,因为 words[1] 的反转字符串 "ab" 与 words[0] 相等。
可以证明最多匹配数目是 1 。

示例 3:

输入:words = ["aa","ab"]
输出:0
解释:这个例子中,无法匹配任何字符串。

提示:

  • 1 <= words.length <= 50
  • words[i].length == 2
  • words 包含的字符串互不相同。
  • words[i] 只包含小写英文字母。

分析:
思路1:

  • 将字符串反转
  • 然后将字符串存入hash中
  • 反转字符串,将反转后的字符串存入hash中(如果存在,就+1)(如果反转后和之前一样,就不+1)
  • 遍历hash,如果hash值是2的数,就是有反转串的人,计数
  • 由于每对反转串都会被计数两次,所以最后要除以2

思路2:
直接遍历,如果相同,就count + 1
如何避免多次计数,只要第二次循环j从第一次循环i开始循环就可以了

思路3:
哈希表
对于比较方便得到反转字符串的语言,我们可以在哈希集合中存储字符串本身;对于其它语言,我们可以存储字符串的哈希值,改为判断 words[i]\textit{words}[i]words[i] 的反转字符串的哈希值是否存在。哈希值需要保证不会冲突,本题中字符串的长度为 222 并且只包含小写字母,因此可以使用 100a+b100a + b100a+b 作为哈希值,其中 aaa 和 bbb 分别是两个字符的 ASCII\text{ASCII}ASCII 值。

题解:
我的题解:

class Solution {public int maximumNumberOfStringPairs(String[] words) {Map<String, Integer> maps = new HashMap<>();int count = 0; for (int i = 0; i < words.length; i++) {maps.put(words[i], 1);words[i] = reverse(words[i]);}for (int i = 0; i < words.length; i++) {if (!words[i].equals(reverse(words[i]))) {maps.put(words[i], maps.getOrDefault(words[i], 0) + 1);}}for (Map.Entry<String, Integer> map: maps.entrySet()) {if (map.getValue() == 2) {count++;}}return count/2;}public String reverse(String s) {char[] arr = s.toCharArray();int left = 0, right = s.length() - 1;while(left < right) {char temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}return new String(arr);}
}

知识点:

  • getOrDefault()
  • 字符串反转:转字符数组 - 双指针遍历交换 - 字符数组转为字符串
  • Map遍历:遍历项的类型:Map.Entry
  • 字符串比较值大小 equals()

官方题解1:

class Solution {public int maximumNumberOfStringPairs(String[] words) {int n = words.length;int ans = 0;for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (words[i].charAt(0) == words[j].charAt(1) && words[i].charAt(1) == words[j].charAt(0)) {++ans;}}}return ans;}
}

官方题解2:哈希

class Solution {public int maximumNumberOfStringPairs(String[] words) {int n = words.length;int ans = 0;Set<Integer> seen = new HashSet<Integer>();for (int i = 0; i < n; ++i) {if (seen.contains(words[i].charAt(1) * 100 + words[i].charAt(0))) {++ans;}seen.add(words[i].charAt(0) * 100 + words[i].charAt(1));}return ans;}
}

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

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

相关文章

JavaScript递归函数如何匹配上下级id和pid的数据(for...of,foreach.reduce)

目录 一、for...of 二、forEach 三、reduce 递归函数是一种在编程中常用的方法&#xff0c;用于解决一些需要重复操作的问题。在JavaScript中&#xff0c;递归函数可以用来匹配上下级id和pid的数据结构&#xff0c;例如树形结构或者父子关系的数据。 一、for...of 首先…

Django 图片上传与下载

写在前面 在Web开发中&#xff0c;文件上传和下载是常见的功能之一。 Django 是一位魔法师&#x1fa84;&#xff0c;为我们提供了 FileField 和 ImageField 等神奇得字段类型&#xff0c;以及相应的视图和模板标签&#xff0c;使得处理文件变得十分便捷。本文以图片上传作为…

Docker安装启动、常用命令、应用部署、迁移备份、Dockerfile、Docker私有仓库

目录 1.Docker安装与启动 1.1 安装Docker 1.2 设置ustc的镜像 1.3 Docker的启动与停止 2.常用命令 2.1 镜像相关命令 2.1.1 查看镜像 2.1.2 搜索镜像 2.1.3 拉取镜像 2.1.4 删除镜像 2.2 容器相关命令 2.2.1 查看容器 2.2.2 创建与启动容器 2.2.3 停止与启动容器 2.…

表白墙网站PHP源码,支持封装成APP

源码介绍 PHP表白墙网站源码&#xff0c;适用于校园内或校区间使用&#xff0c;同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装&#xff0c;只需PHP版本5.6以上即可。 通过上传程序进行安装&#xff0c;并设置账号密码&#xff0c;登录后台后切换模板&#xff0c;适配…

动态规划(逐级总结)

注&#xff1a;此篇宏观看待动态规划问题&#xff08;分步解决问题&#xff09; 日升时奋斗&#xff0c;日落时自省 目录 1、斐波那契数列模型&#xff08;爬楼梯&#xff09; 2、路径问题&#xff08;地下城&#xff09; 3、简单多状态问题&#xff08;买卖股票IV&#xff…

编程笔记 html5cssjs 051 CSS表格2-2

编程笔记 html5&css&js 051 CSS表格2-2 一、html表格如何按列设置样式&#xff1f;二、练习小结 多数时候是按列设计表格样式的。 一、html表格如何按列设置样式&#xff1f; 在HTML表格中&#xff0c;可以通过CSS来按列设置样式。以下是一个简单的例子&#xff1a; …

零资本创业106个案例

零资本&#xff1a;【10年创业成功经验教你一万如何赚百万】.pdf: https://url99.ctfile.com/f/33882099-1012075073-9ec698?p5496 (访问密码: 5496) 零资本&#xff1a;【14亿人共同话题&#xff0c;现在做什么最赚钱】.pdf: https://url99.ctfile.com/f/33882099-101207536…

《WebKit 技术内幕》之八(3):硬件加速机制

3 其他硬件加速模块 3.1 2D图形的硬件加速机制 其实网页中有很多绘图操作是针对2D图形的&#xff0c;这些操作包括通常的网页绘制&#xff0c;例如绘制边框、文字、图片、填充等&#xff0c;它们都是典型的2D绘图操作。在HTML5中&#xff0c;规范又引入了2D绘图的画布功能&a…

常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)

前言 有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法&#xff0c;观察者模式&#xff0c;策略模式) 工程方法 定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 ——《设…

服务端实现微信小游戏登录

1 微信小程序用户登录及其流程 小程序可以通过微信官方提供的登录能力,便能方便的获取微信提供的用户身份标识,达到建立用户体系的作用。 官方文档提供了登录流程时序图,如下: 从上述的登录流程时序图中我们发现,这里总共涉及到三个概念。 第一个是小程序,小程序即我们…

【征服redis15】分布式锁的功能与整体设计方案

目录 1. 分布式锁的概念 2.基于数据库做分布式锁 2.1 基于表主键唯一做分布式锁 2.2 基于表字段版本号做分布式锁 2.3 基于数据库排他锁做分布式锁 3.使用Redis做分布式锁 3.1 redis实现分布式锁的基本原理 3.2 问题一&#xff1a;增加超时机制&#xff0c;防止长期持有…

【Python从入门到进阶】47、Scrapy Shell的了解与应用

接上篇《46、58同城Scrapy项目案例介绍》 上一篇我们学习了58同城的Scrapy项目案例&#xff0c;并结合实际再次了项目结构以及代码逻辑的用法。本篇我们来学习Scrapy的一个终端命令行工具Scrapy Shell&#xff0c;并了解它是如何帮助我们更好的调试爬虫程序的。 一、Scrapy Sh…

安装python版opencv的一些问题

安装python版opencv的一些问题 OpenCV是知名的开源计算机视觉算法库&#xff0c;提供了C\Python\Java版共享库。 在Python中使用OpenCV格外简单&#xff0c;一句命令就能安装&#xff0c;一行import就能引入&#xff0c;可谓是神器。然而&#xff0c;在实际使用中可能遇到一些…

Java实现大学计算机课程管理平台 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

第一篇【传奇开心果系列】beeware的toga开发移动应用:轮盘抽奖移动应用

系列博文目录 beeware的toga开发移动应用示例系列博文目录一、项目目标二、开发传奇开心果轮盘抽奖安卓应用编程思路三、传奇开心果轮盘抽奖安卓应用示例代码四、补充抽奖逻辑实现五、开发传奇开心果轮盘抽奖苹果手机应用编程思路六、开发传奇开心果轮盘抽奖苹果手机应用示例代…

【 CSS 】基础 2

“生活就像骑自行车&#xff0c;想要保持平衡&#xff0c;就得不断前行。” - 阿尔伯特爱因斯坦 CSS 基础 2 1. emmet 语法 1.1 简介 Emmet语法的前身是 Zen coding&#xff0c;它使用缩写&#xff0c;来提高 HTML / CSS 的编写速度&#xff0c; VSCode 内部已经集成该语法。…

Python的50个常识问题解答

一、说明 关于python的一些大致理解&#xff0c;初学者可以参考本文做一个直观理解&#xff1b;其中也不乏有趣事实。 二、python大世界 Python于1991年首次发布&#xff0c;由Guido van Rossum创建。 “python”这个名字来源于英国喜剧团体Monty Python&#xff0c;而不是蛇。…

webpack-dev-server原理解析及其中跨域解决方法

webpack proxy ,就是 webpack 提供的解决跨域的方案。其基本行为是接受客户端发送的请求后转发给其他的服务器&#xff0c;目的是为了解决在开发模式下的跨域问题。 原理 webpack中的proxy 工作原理是利用了 http-proxy-middleware 这个http 代理中间件&#xff0c;实现将请求…

专门为机器学习开发的jpy语言

这本来是一个为工科教学专门开发的附属品&#xff0c;并不是说Python或Java有多不好&#xff0c;根本上它就是一个Java工程教材&#xff0c;但又要结合人工智能。因此&#xff0c;出现了这样一个包容性的怪胎&#xff0c;可以用python一样的语法与Java一起编写。 没流行起来的一…

【ARM 嵌入式 编译系列 2.5 -- GCC 编译参数学习 --specs=nano.specs选项 】

请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 概述nano.specs示例使用注意事项问题总结概述 ARM 工具链 (arm-none-eabi-) 包括了一个叫作 --specs 的编译器和链接器选项,这个选项允许用户指定一个或多个 “specs” 文件,以影响编译或链接阶段的行为。Sp…