【每日一题】找到字符串中所有字母异位词

目录

  • 题目:
  • 思路:
    • 暴力枚举:
    • 滑动窗口:
  • 代码实现:
  • 一些优化:
    • 代码实现:

题目:

找到字符串中所有字母异位词在这里插入图片描述


思路:

暴力枚举:

对于有关子串的题目我们使用暴力枚举都是比较轻易做出来的

但是我们注意到此题寻找的是字母异位词,并不是顺序的,所以我们可以使用哈希表来进行解决这个问题。

我们先创建一个hash1存储p的数据
在创建一个hash2来存放遍历s的数据
在这里插入图片描述
因为对于这题来说暴力算法肯定是超时的,所以我们只讲述思路,
但是这个思路是非常重要的。

滑动窗口:

我们可以通过暴力解法来优化得到滑动窗口。
在这里插入图片描述
知道可以使用滑动窗口来做题我们便可以使用滑动窗口的模板来做题。
在这里插入图片描述

代码实现:

class Solution {
public:
    bool check(int* hash1, int* hash2)
    {
        for(int i = 0; i < 26; i++)
            if(hash1[i] != hash2[i])    return false;
        return true;
    }

    vector<int> findAnagrams(string s, string p) {
        int hash1[26] = { 0 };
        for(auto ch : p)    hash1[ch - 'a']++;

        int hash2[26] = { 0 };
        vector<int> ans;
        for(int left = 0, right = 0; right < s.size(); right++)
        {
            //进窗口
            char in = s[right];
            hash2[in - 'a']++;
            //判断
            while(right - left + 1 > p.size())
            {
                char out = s[left++];
                hash2[out - 'a']--;
            }
            //更新结果
            if(check(hash1, hash2)) ans.push_back(left);
        }
        return ans;
    }
};

一些优化:

我们发现,每次判断是否要更新结果时都要判断26次,
虽然时间复杂度依旧是O(N),但是我们可以优化一下这个地方。

如何进行优化呢?
我们增加一个计数器,这个计数器用来存放当前窗口有效的元素个数,然后在我们判断是否更新时只需要比较count与p的长度即可。
当然,这个count维护的地方也有一些细节

  • 入窗口后维护
  • 出窗口前维护

代码实现:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int hash1[26] = { 0 };
        for(auto ch : p)    hash1[ch - 'a']++;

        int hash2[26] = { 0 };
        vector<int> ans;
        for(int left = 0, right = 0, count = 0; right < s.size(); right++)
        {
            //进窗口
            char in = s[right];
            if(++hash2[in- 'a'] <= hash1[in - 'a'])  count++;
            //判断
            while(right - left + 1 > p.size())
            {
                char out = s[left++];
                if(hash2[out- 'a']-- <= hash1[out - 'a'])   count--;
            }
            //更新结果
            if(count == p.size()) ans.push_back(left);
        }
        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.2 在卷积神经网络中,如何计算各层感受野的大小

1.2 在卷积神经网络中&#xff0c;如何计算各层感受野的大小 分析与解答&#xff1a; 在卷积神经网络中&#xff0c;由于卷积的局部连接性&#xff0c;输出特征图上的每个节点的取值&#xff0c;是由卷积核在输入特征图对应位置的局部区域内进行卷积而得到的&#xff0c;因此这…

Sora惊艳出世,AI能否给人类带来新的“视界”?

2月16日&#xff0c;OpenAI公司公布了其首个文生视频大模型Sora&#xff0c;同时展示了多个由Sora生成的最长时间达一分钟的视频&#xff0c;引起科技圈震动。 钢铁侠马斯克对其发出“人类愿赌服输”的感叹&#xff0c;360董事长周鸿祎也作出“Sora意味着AGI实现将从10年缩短到…

【探索Linux】—— 强大的命令行工具 P.24(网络基础)

阅读导航 引言一、计算机网络背景1. 网络发展历史 二、认识 "协议"1. 网络协议概念2. 网络协议初识&#xff08;1&#xff09;协议分层&#xff08;2&#xff09;OSI参考模型&#xff08;Open Systems Interconnection Reference Model&#xff09;&#xff08;3&…

k8s-kubeapps图形化管理 21

结合harbor仓库 由于kubeapps不读取hosts解析&#xff0c;因此需要添加本地仓库域名解析&#xff08;dns解析&#xff09; 更改context为全局模式 添加repo仓库 复制ca证书 添加成功 图形化部署 更新部署应用版本 再次进行部署 上传nginx 每隔十分钟会自动进行刷新 在本地仓库…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的教室人员检测与计数(Python+PySide6界面+训练代码)

摘要&#xff1a;开发教室人员检测与计数系统对于优化教学资源和提升教学效率具有重要意义。本篇博客详细介绍了如何利用深度学习构建此系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5的性能&#xff0c;展示…

vue2本地开发环境正常,生产环境下this.$router.push({ name: ‘login‘ })不跳转

如果在Vue.js 2中在本地开发环境下正常运行,但在生产环境下使用​​this.$router.push({ name: login })​​不起作用,可能有几个原因需要检查和解决: 路由配置问题: 确保你的路由配置正确,特别是确保在生产环境中,路由的配置和本地开发环境一致。检查是否正确设置了name…

以目标检测和分类任务为例理解One-Hot Code

在目标检测和分类任务中&#xff0c;每一个类别都需要一个编码来表示&#xff0c;同时&#xff0c;这个编码会用来计算网络的loss。比如有猫&#xff0c;狗&#xff0c;猪三种动物&#xff0c;这三种动物相互独立&#xff0c;在分类中&#xff0c;将其中任意一种分类为其他都同…

【大数据Hive】hive 多字段分隔符使用详解

目录 一、前言 二、hive默认分隔符规则以及限制 2.1 正常示例&#xff1a;单字节分隔符数据加载示例 2.2 特殊格式的文本数据&#xff0c;分隔符为特殊字符 2.2.1 文本数据的字段中包含了分隔符 三、突破默认限制规则约束 3.1 数据加载不匹配情况 1 3.2 数据加载不匹配…

力扣 第 125 场双周赛 解题报告 | 珂学家 | 树形DP + 组合数学

前言 整体评价 T4感觉有简单的方法&#xff0c;无奈树形DP一条路上走到黑了&#xff0c;这场还是有难度的。 T1. 超过阈值的最少操作数 I 思路: 模拟 class Solution {public int minOperations(int[] nums, int k) {return (int)Arrays.stream(nums).filter(x -> x <…

Premiere Pro:视频制作的瑞士军刀,让创意飞翔!

Premiere Pro&#xff0c;由Adobe公司推出的专业非线性视频编辑软件&#xff0c;已成为众多视频制作人员的首选工具。其功能之强大、操作之便捷&#xff0c;为视频制作带来了革命性的改变。 首先&#xff0c;Premiere Pro支持多种视频格式的导入和编辑&#xff0c;从剪辑、修剪…

【微服务】在Java体系中SpringCloud和SpringCloud Alibaba各通过哪些具体组件来实现微服务架构呢?

前面我们介绍了微服务架构的各个组件以及各组件的职责&#xff0c;在Java领域中&#xff0c;Spring可以说是无人不知无人不晓的&#xff0c;我们现代的企业级应用和互联网应用&#xff0c;很大一部分都是构建在Spring生态体系上的&#xff0c;同样&#xff0c;实现微服务架构的…

Redis常用指令,jedis与持久化

1.redis常用指令 第一个是key的常用指令&#xff0c;第二个是数据库的常用指令 前面的那些指令都是针对某一个数据类型操作的&#xff0c;现在的都是对所有的操作的 1.key常用指令 key应该设计哪些操作 key是一个字符串&#xff0c;通过key获取redis中保存的数据 对于key…

GCN原理回顾论文导读

Cora_dataset description Cora数据集是一个常用的学术文献用网络数据集&#xff0c;用于研究学术文献分类和图网络分析等任务。 该数据集由机器学习领域的博士论文摘要组成&#xff0c;共计2708篇论文&#xff0c;涵盖了7个不同的学科领域。每篇论文都有一个唯一的ID&#xf…

c++之旅——第四弹

大家好啊&#xff0c;这里是c之旅第三弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 本篇文章的主…

【css面试题】BFC

参考文章1 参考文章2 什么是BFC BFC全称是Block Formatting Context&#xff0c;意思就是块级格式化上下文。你可以把BFC看做一个容器&#xff0c;容器里边的元素不会影响到容器外部的元素。 BFC的特性 BFC是一个块级元素&#xff0c;块级元素在垂直方向上依次排列。 BFC是…

QT 网络编程 8

1 基础知识 udp tcp 2 UDP 框架 客户端: QUdpSocket x; qint64 writeDatagram( const char *data, qint64 size, const QHostAddress &address, quint16 port );服务器: void Server::initSocket(){udpSocket new QUdpSocket(this);udpSocket->bind(QHostAddress…

【Redis | 第七篇】Redis过期策略、内存淘汰策略

文章目录 7.Redis过期策略、内存淘汰策略7.1过期策略7.2内存淘汰策略 7.Redis过期策略、内存淘汰策略 7.1过期策略 我们在set key的时候&#xff0c;可以给它设置一个过期时间&#xff0c;比如expire key 60。指定这key60s后过期。 60s后&#xff0c;redis是如何处理的嘛&am…

性别和年龄的视频实时监测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 性别和年龄检测 Python 项目 首先介绍性别和年龄检测的高级Python项目中使用的专业术语 什么是计算机视觉&#xff1f; 计算机视觉是使计算机能…

ER-NeRF实时对话数字人模型训练与部署

ER-NeRF是基于NeRF用于生成数字人的方法&#xff0c;可以达到实时生成的效果。 下载源码 cd D:\Projects\ git clone https://github.com/Fictionarry/ER-NeRF cd D:\Projects\ER-NeRF 下载模型 准备面部解析模型 wget https://github.com/YudongGuo/AD-NeRF/blob/master/…

如何预估系统的瓶颈

如何预估系统的瓶颈 1 CPU1.1 CPU和同吞吐量 2 内存3 磁盘IO4 网络宽带5 数据库服务器6 APP服务端 CPU 使用率、内存占用、网络流量、磁盘 IO等指标&#xff0c;异常或者持续高位的情况下&#xff0c;都可能是系统瓶颈的表现。 1 CPU CPU使用率正常在70%左右&#xff0c;如果…