242. 有效的字母异位词(排序后用Map或者滑动窗口用Map)

文章目录

  • 242. 有效的字母异位词
  • 49. 字母异位词分组
  • 438. 找到字符串中所有字母异位词

242. 有效的字母异位词

242. 有效的字母异位词

给定两个字符串 st,编写一个函数来判断t是否是s
字母异位词(字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。)

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 10^4
  • s 和 t 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

哈希表思路:

数组有时候也可以充当Map使用

什么时候用哈希表

  • 一般来说哈希表都是用来快速判断一个元素是否出现集合里。

什么时候用数组

  • 当题目明确指出只有字符串的时候,可以使用数组存储ascii码

当前题目由于都是小写字母,而字母就26个,故可以建立一个长度是26的数组,遍历sts中某个字母出现了就将他对应的数组中那个位置加1,而t相反,是减1,最后判断数组中每个元素是否为0即可

因为字符a到字符zASCII26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25

在遍历 字符串s的时候,只需要将s[i] - ‘a’所在的元素做+1 操作即可,并不需要记住字符aASCII,只要求出一个相对数值就可以了。 这样就将字符串s中字符出现的次数,统计出来了。

那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。

那么最后检查一下,arr数组如果有的元素不为零0,说明字符串st一定是谁多了字符或者谁少了字符,return false

最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。

Go代码

func isAnagram(s string, t string) bool {/*思路:字母异位词即两个单词中相同字母出现相同次数由于都是小写字母,而字母就26个,故可以建立一个长度是26的数组遍历s和t,s中某个字母出现了就将他对应的数组中那个位置加1,而t相反,是减1,最后判断数组中每个元素是否为0即可*/if len(s) != len(t) {return false}arr := make([]int,26)for i := 0;i < len(s);i++{a := s[i] - 'a'b := t[i] - 'a'arr[a]++arr[b]--}for i := 0;i < len(arr);i++ {if arr[i] != 0 {return false}}return true
}

在这里插入图片描述

49. 字母异位词分组

49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

Go代码

func groupAnagrams(strs []string) [][]string {//我们可以用一个map[string][]string来完成分组,其中key是单词按字母序排序后的形式,//value则是所有按字母序排序后是key的单词的集合,由此即完成了分组的任务。if len(strs) == 0 {return [][]string{}}m := make(map[string][]string)for i := 0;i < len(strs);i++ {// sort只提供了对切片的排序,所以先转为字节切片,后面再转回字符串temp := []byte(strs[i])sort.Slice(temp,func(i,j int)bool {return temp[i] < temp[j]})key:= string(temp)if _,ok := m[key];ok {m[key] = append(m[key],strs[i])} else {arr := make([]string,0)arr = append(arr,strs[i])m[key] = arr}}res := make([][]string,0)for _,val := range m {res = append(res,val)}return res
}

在这里插入图片描述

438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词

给定两个字符串 sp,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

  • 1 <= s.length, p.length <= 3 * 10^4
  • s 和 p 仅包含小写字母

思路:

暴力法: 异位词排序之后的字符串是相等的,所以可以以s的每一个字符作为起点,取和p相同长度的字符,看看排序后是否相等即可。注:该方法主要是提供了一下思路,在leetcode上提交的时候会超时。

Go代码

func findAnagrams(s string, p string) []int {// 异位词排序之后的字符串是相等的// 所以可以以s的每一个字符作为起点,取和p相同长度的字符,看看排序后是否相等即可if len(s) == 0 || len(s) < len(p){return []int{}}var res []int// 注意:因为最后一个字符串长度至少需要len(p)// 所以遍历的最后一个位置应该是 len(s) - len(p),因此这里是小于 len(s) - len(p) + 1for i := 0;i < len(s) - len(p) + 1;i++ {if sortString(s[i:i+len(p)]) == sortString(p) {res = append(res,i)}}return res
}// 将字符串s排序后返回新的字符串
func sortString(s string) string {temp := []byte(s)sort.Slice(temp,func(i,j int)bool {return temp[i] < temp[j]})return string(temp)
}

在这里插入图片描述

滑动窗口法:滑动窗口法:异位词的每个字母出现的次数都是一样的,滑动窗口四步走,如下:

  1. 窗口内容:当前窗口长度与p相同
  2. 如果移动终点:后移直到窗口长度与p相同
  3. 如何移动起点:后移直到窗口长度与p相同
  4. 结果:当前窗口内容是否是p的异位词,即每个字符出现次数相同,符合条件则加到结果中。

Go代码

func findAnagrams(s string, p string) []int {// 滑动窗口法:异位词的每个字母出现的次数都是一样的/*1. 窗口内容:当前窗口长度与p相同2. 如果移动终点:窗口长度与p相同3. 如何移动起点:窗口长度与p相同4. 结果:当前窗口内容是否是p的异位词,即每个字符出现次数相同*/if len(s) == 0 || len(s) < len(p) {return []int{}}res := make([]int,0)// p 中每个字符出现的次数mp := make(map[byte]int)for i := 0;i < len(p);i++ {mp[p[i]]++ }ms := make(map[byte]int) // 记录当前窗口每个字符出现的次数left,right := 0,0for ;right < len(s);right++ {ms[s[right]]++ // 当前字符出现次数加1if right - left + 1 < len(p) {continue}// 窗口长度和p相等时,比较每个字符出现的次数是否也相等flag := true // 默认当前窗口和p是异位词for k,v := range mp {if cnt,ok := ms[k];!ok || cnt != v {flag = falsebreak} }if flag {res = append(res,left)}// 起点后移ms[s[left]]--left++       }return res}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025

VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025 VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7.0U3 标准版集成 Intel 网卡、Realtek USB 网卡 和 NVMe 驱动 请访问原文链…

【Linux进程控制】进程创建|终止

目录 一、进程创建 fork函数 写时拷贝 二、进程终止 想明白&#xff1a;终止是在做什么&#xff1f; 进程退出场景 常见信号码及其含义 进程退出的常见方法 正常终止与异常终止 exit与_exit的区别 一、进程创建 fork函数 在Linux中fork函数是非常重要的函数&#x…

【Python电商项目汇报总结】**采集10万+淘宝商品详情数据注意事项总结汇报**

大家好&#xff0c;今天我想和大家聊聊我们在采集10万淘宝商品详情数据时需要注意的一些关键问题。这不仅仅是一个技术活&#xff0c;更是一场细心与合规的较量。下面&#xff0c;我就用咱们都听得懂的话&#xff0c;一一给大家说道说道。 **一、明确目标&#xff0c;有的放矢…

Autosar BswM配置-手动建立Swc Port实现自定义模式切换

文章目录 前言Mode配置Interface配置Data type mappingBswM配置BswMModeRequestPort配置BswMModeCondition配置BswMLogicalExpression配置BswMDataTypeMappingSetsSWC接口配置RTE接口map代码实现总结前言 客户需求中需要在指定电压范围内允许通信,而目前项目中通信主要由PNC控…

C++从入门到起飞之——继承下篇(万字详解) 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、派⽣类的默认成员函数 1.1 四个常⻅默认成员函数 1.2 实现⼀个不能被继承的类 ​编辑 2. 继承与友…

SpringBoot 消息队列RabbitMQ 交换机模式 Fanout广播 Direct定向 Topic话题

介绍 作用是接收生产者发送的消息&#xff0c;并根据某种规则将这些消息路由到一个或多个队列。交换机根据绑定规则和路由键来决定如何将消息分发到队列。简而言之&#xff0c;交换机是消息路由的核心组件&#xff0c;它负责将消息从生产者引导到适当的队列&#xff0c;以便消…

防火墙--NAT技术,基于源NAT,NAT服务器,双向NAT

文章目录 防火墙--NAT技术一、基于源NAT**方式**&#xff1a;NAT No-PATNAPT出接口地址方式Smart NAT三元组 NAT 二、基于服务器的NAT多出口场景下的NAT Server 三、双向NAT 防火墙–NAT技术 基于源NAT&#xff1a;用于将内部网络的私有IP地址转换为公共IP地址&#xff0c;以便…

[Meachines] [Easy] Sauna DC域+AS-REP+TGT票证窃取+AutoLogon凭据+DCSync攻击

信息收集 IP AddressOpening Ports10.10.10.175TCP:53,80,88,135,139,389,445,464,593,3268,3269,5985 $ nmap -p- 10.10.10.175 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 53/tcp open domain? | fingerprint-strings: | DNSVersionBindReqTCP…

如何处理模型API速率限制

引言 当我们访问大模型相关的API服务时&#xff0c;通常会遇到速率限制(即限流)&#xff0c;它用于防止用户向某个API发送大量请求&#xff0c;防止请求过载&#xff0c;确保每个人都能公平地访问API。 速率限制的方式 速率限制通常有以下几种形式&#xff1a; RPM(request…

详解HTTP/HTTPS协议

HTTP HTTP协议全名为超文本传输协议。HTTP协议是应用层协议&#xff0c;其传输层协议采用TCP协议。 请求—响应模型 HTTP协议采用请求-响应模型&#xff0c;通常由客户端发起请求由服务端完成响应。资源存储在服务端&#xff0c;客户端通过请求服务端获取资源。 认识URL 当…

Linux 系统盘空间不足,想要将 Docker 镜像和容器数据迁移到数据盘

摘要&#xff1a;大家在Linux上用Docker部署项目的时候&#xff0c;有时候会部署多个项目&#xff0c;系统盘空间不足&#xff0c;数据盘又挂载有很多空间&#xff0c;这时候就会想要将 Docker 镜像和容器数据迁移到数据盘&#xff0c;本文主要讲解迁移步骤和迁移过程中遇到的一…

vue2的diff算法

Vue2 的虚拟 DOM diff 算法是一种高效的算法&#xff0c;用于比较新旧两个虚拟 DOM 树&#xff0c;找出差异并更新到真实 DOM 上。这个算法的核心在于尽量减少不必要的 DOM 操作&#xff0c;提高性能。 虚拟dom&#xff1a;把DOM数据化&#xff0c;先通过不断地操作数据&#…

数据集 CULane 车道线检测 >> DataBall

数据集 CULane 车道线检测 自动驾驶 无人驾驶目标检测 CULane是用于行车道检测学术研究的大规模具有挑战性的数据集。它由安装在六辆由北京不同驾驶员驾驶的不同车辆上的摄像机收集。收集了超过55小时的视频&#xff0c;并提取了133,235帧。数据示例如上所示。我们将数据集分为…

【C++算法】前缀和

前缀和 题目链接 前缀和https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId230&tqId2021480&ru/exam/oj&qru/ta/dynamic-programming/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%2…

传神论文中心|第25期人工智能领域论文推荐

在人工智能领域的快速发展中&#xff0c;我们不断看到令人振奋的技术进步和创新。近期&#xff0c;开放传神&#xff08;OpenCSG&#xff09;传神社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自…

Java-idea小锤子图标

这一版的idea小锤子图标其实就在这里 点进去就找到了~

mtk7628 网口灯问题

板子上电插入网线到网口&#xff0c;只有wan口灯会亮&#xff0c;插入lan口灯不会亮。对比了ok的代码&#xff0c;先对比设备树&#xff0c;未看到网口相关的GPIO。 mt7628an_WMD-7688A-12816.dts mt7628an_hilink_hlk-7628n.dts 继续查看网口相关代码&#xff0c;加打印&…

在实际LabVIEW开发中,哪些算法是常用的?

在LabVIEW的实际开发中&#xff0c;常用的算法主要集中在数据处理、控制系统、信号处理、图像处理等领域。以下是一些常用算法的介绍&#xff1a; 1. PID控制算法 PID&#xff08;比例-积分-微分&#xff09;控制是LabVIEW中常用的算法之一&#xff0c;广泛应用于工业自动化和…

Leetcode—1184. 公交站间的距离【简单】

2024每日刷题&#xff08;161&#xff09; Leetcode—1184. 公交站间的距离 实现代码 class Solution { public:int distanceBetweenBusStops(vector<int>& distance, int start, int destination) {int clockwise 0;int counterclockwise 0;if(start > desti…

华为防火墙智能选路篇之链路权重(带宽)负载分担

基于链路的权重负载分担&#xff08;真机演示&#xff09; 这里博主采用真机演示&#xff0c;模拟器只能配置没办法模拟出效果&#xff0c;真机能够真实的体验出效果&#xff0c;更好的去理解&#xff0c;所以这边采用真机配置了。环境简化了&#xff0c;防火墙内网接了一台测试…