算法每日一题: 最大字符串匹配数目 | 哈希 | 哈希表 | 题意分析
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;}
}
相关文章:
算法每日一题: 最大字符串匹配数目 | 哈希 | 哈希表 | 题意分析
hello 大家好,我是星恒 今天给大家带来的是hash,思路有好几种,需要注意的是这中简单的题目需要仔细看条件,往往他们有对应题目的特殊的解法 题目:leetcode 2744给你一个下标从 0 开始的数组 words ,数组中包…...
自然语言处理(Natural Language Processing,NLP)解密
专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9 Python 专栏:http://t.csdnimg.cn/hMwPR Redis 专栏:http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏:http://t.csdni…...
【DevOps-08-5】目标服务器准备脚本,并基于Harbor的最终部署
一、简要描述 告知目标服务器拉取哪个镜像判断当前服务器是否正在运行容器,停止并删除如果目标服务器已经存在当前镜像,删除当前版本的镜像目标服务器拉取Harbor上的镜像将拉取下来的镜像运行成容器二、准备目标服务器脚本文件 1、在部署的目标服务器准备deploy.sh部署脚本 …...
用Java实现01背包问题 用贪心算法
贪心算法不是解决01背包问题的有效方法,因为贪心算法只能保证得到一个近似最优解,而无法保证得到最优解。因此,我们需要使用动态规划来解决01背包问题。以下是使用Java实现的动态规划解法: public class KnapsackProblem {public…...
JUC并发编程-8锁现象
5. 8锁现象 如何判断锁的是谁!锁到底锁的是谁? 锁会锁住:对象、Class 深刻理解我们的锁 问题1 两个同步方法,先执行发短信还是打电话 public class dome01 {public static void main(String[] args) {Phone phone new Phon…...
集美大学“第15届蓝桥杯大赛(软件类)“校内选拔赛 D矩阵选数
经典的状态压缩DP int dp[15][(1<<14)10]; int a[15][15]; void solve() {//dp[i][st]考虑到了第i行 并且当前考虑完第i行以后的选择状态是st的所有方案中的最大值for(int i1;i<13;i)for(int j1;j<13;j)cin>>a[i][j];for(int i1;i<13;i){for(int j0;j<…...
Android System Service系统服务--1
因为工作中经常需要解决一些framework层的问题,而framework层功能一般都是system service 的代理stub,然后封装相关接口,并提供给APP层使用,system service则在不同的进程中运行,这样实现了分层,隔离&#…...
【RT-DETR有效改进】华为 | Ghostnetv1一种专为移动端设计的特征提取网络
前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…...
45个经典Linux面试题!赶紧收藏!
问题一: 绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令? 答案:绝对路径:如/etc/init.d当前目录和上层目录:./ …/主目录:~/切换目…...
将字符串中可能被视为正则表达式的特殊字符进行转义re.escape()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将字符串中可能被视为 正则表达式的特殊字符 进行转义 re.escape() [太阳]选择题 请问以下代码最后输出的结果是? import re s [a-z] print("【显示】s ",s) print(&q…...
C语言:函数指针的使用
在C语言中,函数指针是指向函数的指针变量。它可以存储函数的地址,使得可以通过该指针来调用函数。以下是函数指针的基本概念和用法: 一、基本概念: 声明函数指针: returnType (*pointerName)(parameterTypes); 这里 r…...
「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(二)
DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。 在web项目中使用DHTMLX Gantt时,开发人员经常需要满足与UI外观相关的各种需求。因此他们必须确定JavaScript甘特图库的…...
Webpack5入门到原理18:Plugin 原理
Plugin 的作用 通过插件我们可以扩展 webpack,加入自定义的构建行为,使 webpack 可以执行更广泛的任务,拥有更强的构建能力。 Plugin 工作原理 webpack 就像一条生产线,要经过一系列处理流程后才能将源文件转换成输出结果。 这条…...
PWM之舵机
舵机又称直流电机,如下图 本节承接上节,具体的PWM技术已经在上一节讲的很详细了,本节就不再讲了,那么我们的重点就放在直流电机的工作原理上了。 一、工作原理 我们研究直流电机,主要式研究直流电机旋转速度的调节&a…...
Python并发与多线程:IO并发(阻塞IO、非阻塞IO、IO多路复用、异步IO)
在Python中,有多种处理并发的方式,其中之一就是使用多线程进行IO并发操作。在IO操作中,有四种常见的方式:阻塞IO、非阻塞IO、IO多路复用和异步IO。 阻塞IO(Blocking IO):当执行一个IO操作时&…...
React16源码: React中的IndeterminateComponent的源码实现
IndeterminateComponent 1 )概述 这是一个比较特殊的component的类型, 就是还没有被指定类型的component在一个fibrer被创建的时候,它的tag可能会是 IndeterminateComponent在 packages/react-reconciler/src/ReactFiber.js 中,有…...
SpringBoot:详解Bean生命周期和作用域
🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、生命周期二…...
【图解数据结构】顺序表实战指南:手把手教你详细实现(超详细解析)
🌈个人主页:聆风吟 🔥系列专栏:图解数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️线性表1.1 🔔线性表的定义1.2 🔔线性表的存储结构 二. ⛳️顺序表…...
WordPress怎么禁用文章和页面古腾堡块编辑器?如何恢复经典小工具?
现在下载WordPress最新版来搭建网站,默认的文章和页面编辑器,以及小工具都是使用古腾堡编辑器(Gutenberg块编辑器)。虽然有很多站长说这个编辑器很好用,但是仍然有很多站长用不习惯,觉得操作太难了…...
【HarmonyOS】掌握布局组件,提升应用体验
从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…...
别再只调PID了!基于STM32C8T6的电磁循迹小车,从硬件滤波到软件算法的抗干扰全攻略
电磁循迹小车的抗干扰实战:从硬件滤波到软件优化的全链路解决方案 当你的电磁循迹小车在实验室里跑得风生水起,一到比赛现场却频频"抽风",这往往不是PID参数调得不够好,而是整个系统的抗干扰设计存在漏洞。本文将带你深…...
第三章 Qt 编译及安装
1. Qt 编译安装 2 Qt 在线安装 在线安装包的下载地址: https://download.qt.io/official_releases/online_installers/ Qt对不同的平台提供了不同版本的安装包,可根据实际情况自行下载安装,本文档使用qt-online-installer-windows-x64-on…...
轻量级AI写作工坊:OpenClaw+nanobot内容创作流
轻量级AI写作工坊:OpenClawnanobot内容创作流 1. 为什么需要自动化写作助手 作为一名技术博主兼自媒体运营者,我每天都要面对内容创作的"三重压力":选题焦虑、写作耗时、发布繁琐。最痛苦的是,当我花两小时写完一篇技…...
Android开机向导定制实战:从源码分析到禁用状态栏的隐藏技巧
Android开机向导深度定制:从源码解析到状态栏控制实战 第一次接触Android开机向导定制时,我被这个看似简单却隐藏复杂逻辑的系统组件深深吸引。作为设备初始化的第一道门户,开机向导不仅承载着用户体验的第一印象,更是厂商品牌展示…...
MX28智能舵机RS485底层驱动开发实战
1. MX28智能舵机底层驱动技术解析:基于RS485总线的嵌入式控制实现1.1 技术定位与工程价值MX28是Robotis公司推出的第二代高精度智能舵机(Smart Actuator),采用RS485半双工差分总线通信,支持位置、速度、扭矩闭环控制及…...
无需编程!DouyinLiveWebFetcher让运营人员轻松实现抖音直播弹幕实时采集
无需编程!DouyinLiveWebFetcher让运营人员轻松实现抖音直播弹幕实时采集 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取(2024最新版本) 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 如…...
YOLOv8目标检测新玩法:用VMamba替换C2f模块,我在DDSM医疗数据集上mAP涨到了0.724
YOLOv8与VMamba融合:医疗影像目标检测的突破实践 在医疗影像分析领域,目标检测技术正经历着从传统卷积神经网络到新型架构的转变。最近,我们将YOLOv8模型中的C2f模块替换为VMamba模块,在DDSM乳腺X光数据集上取得了mAP 0.724的显著…...
零基础入门:用eNSP搭建USG5500防火墙IPsec虚拟专用网实验环境
从零构建企业级安全隧道:eNSP模拟USG5500防火墙IPsec实战指南 当你第一次听说"IPsec"这个词时,可能会联想到那些科技电影中黑客们建立的加密通道。实际上,IPsec技术离我们并不遥远——它正默默保护着每天数以亿计的企业数据传输。本…...
Debugging torch.distributed.DistBackendError: NCCL Communicator Setup and ncclUniqueId Retrieval Iss
1. 理解NCCL通信错误的核心问题 当你看到torch.distributed.DistBackendError: [2] is setting up NCCL communicator and retrieving ncclUniqueId这个错误时,本质上是在说GPU之间的"对讲机"无法正常建立连接。想象一下你正在组织一场多房间的线上会议&…...
各向异性方解石晶体的双折射效应
1. 摘要 双折射效应是各向异性材料最重要的光学特性,并广泛应用于多种光学器件。当入射光波撞击各向异性材料,会以不同的偏振态分束到不同路径,即众所周知的寻常光束和异常光束。在本示例中,描述了如何利用VirtualLab Fusion对双折…...
