当前位置: 首页 > news >正文

题目:1297. 子串的最大出现次数

> Problem: 1297. 子串的最大出现次数

题目:1297. 子串的最大出现次数

题目描述

给定一个字符串 s,要求找到满足以下条件的任意子串的出现次数,并返回该子串的最大出现次数:

  1. 子串中不同字母的数目必须小于等于 maxLetters
  2. 子串的长度必须在 minSizemaxSize 之间。

示例:

  • 示例 1

    输入:s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4
    输出:2
    解释:子串 "aab" 在字符串中出现了 2 次,且符合所有要求。
    
  • 示例 2

    输入:s = "aaaa", maxLetters = 1, minSize = 3, maxSize = 3
    输出:2
    解释:子串 "aaa" 在字符串中出现了 2 次,且满足不同字母不超过 1 个。
    
  • 示例 3

    输入:s = "aabcabcab", maxLetters = 2, minSize = 2, maxSize = 3
    输出:3
    解释:子串 "ab"、"bc" 和 "ca" 都出现了 3 次,满足条件。
    

题目分析

题目要求在给定字符串 s 中,找到满足以下条件的子串,并返回其出现的最大次数:

  1. 子串中不同字母的数目小于等于 maxLetters
  2. 子串的长度必须在 [minSize, maxSize] 范围内。

难点在于我们需要找到出现次数最多的子串,同时需要控制子串长度和字母种类数量。

解题思路

这个问题的核心是通过滑动窗口遍历所有可能的子串,并统计每个子串的出现次数。为了解决这个问题,主要有几个关键步骤:

  1. 滑动窗口提取子串:我们遍历字符串,逐个提取长度为 minSize 的子串,检查这些子串是否满足不同字母数小于等于 maxLetters 的要求。

  2. 统计子串出现次数:使用哈希表 unordered_map 统计每个符合条件的子串的出现次数。

  3. 记录出现次数最多的子串:在遍历过程中,我们会实时更新子串的最大出现次数。

关键点解释

在实际实现中,我们直接使用 minSize 而不是遍历从 minSizemaxSize 所有可能的长度。这是因为:

  1. 最小长度子串更容易符合 maxLetters 限制:较短的子串往往更容易满足字母种类不超过 maxLetters 的限制。如果使用较长的子串,很可能会包含更多的不同字母,无法满足条件。
  2. 简化计算复杂度:遍历多个长度会显著增加计算复杂度,而实际上较长子串不会比较短子串出现更多次,直接使用 minSize 能够降低时间复杂度。
  3. 长度为 minSize 的子串已经覆盖所有可能的子串:即便存在满足 maxLetters 条件的较长子串,它们也必然包含短子串的一部分,直接检查 minSize 长度已经能够找到符合条件的子串。

算法步骤

  1. 初始化变量

    • 使用一个哈希表 freqMap 来存储每个子串的出现次数。
    • 使用变量 maxFreq 来记录最大出现次数。
  2. 遍历字符串

    • 遍历字符串 s,从每个位置 i 开始,提取长度为 minSize 的子串。
    • 使用 unordered_set 统计子串中的不同字母数,如果满足 maxLetters 的要求,则记录该子串的出现次数。
  3. 更新最大出现次数

    • 每次有符合条件的子串时,更新 maxFreq,确保记录下出现次数最多的子串。
  4. 返回结果:最终返回 maxFreq,即最大出现次数。

代码实现

class Solution {
public:int maxFreq(string s, int maxLetters, int minSize, int maxSize) {unordered_map<string, int> freqMap; // 存储子串的频率int maxFreq = 0; // 记录最大出现频率// 遍历所有长度为 minSize 的子串for (int i = 0; i <= s.size() - minSize; ++i) {string subStr = s.substr(i, minSize); // 提取长度为 minSize 的子串unordered_set<char> uniqueLetters(subStr.begin(), subStr.end()); // 计算子串中不同字母数// 如果满足不同字母数 <= maxLetters 的条件if (uniqueLetters.size() <= maxLetters) {freqMap[subStr]++; // 记录子串出现次数maxFreq = max(maxFreq, freqMap[subStr]); // 更新最大出现频率}}return maxFreq; // 返回最大出现次数}
};

详细解析

  • 字符串切割:每次通过 substr 提取长度为 minSize 的子串,这样可以保证我们只处理符合要求长度的子串。

  • 字母去重统计:我们使用 unordered_set 来去重统计子串中的不同字母,这样可以快速判断该子串是否符合 maxLetters 的限制。

  • 频率统计:通过 unordered_map 来记录子串出现的次数。对于每一个符合要求的子串,都会将其频率加 1。

  • 结果输出:每次找到符合要求的子串后,我们实时更新最大频率 maxFreq,确保最终得到最大出现次数的子串。

时间复杂度

  • 时间复杂度为 O(n * minSize),其中 n 为字符串 s 的长度。因为我们需要遍历每个长度为 minSize 的子串,并进行去重和统计操作。

  • 空间复杂度为 O(n),主要用于存储子串的频率哈希表和去重的 unordered_set

相关文章:

题目:1297. 子串的最大出现次数

> Problem: 1297. 子串的最大出现次数 题目&#xff1a;1297. 子串的最大出现次数 题目描述 给定一个字符串 s&#xff0c;要求找到满足以下条件的任意子串的出现次数&#xff0c;并返回该子串的最大出现次数&#xff1a; 子串中不同字母的数目必须小于等于 maxLetters。…...

一力破万法,高并发系统优化通解思路

高并发系统优化&#xff1a;从理论到Java实践 针对高并发场景&#xff0c;以下策略能够有效提升系统的稳定性和响应速度&#xff1a; 加集群 结果&#xff1a;通过增加服务器数量&#xff0c;实现负载均衡&#xff0c;提高系统整体处理能力。过程&#xff1a; 配置负载均衡器&…...

P8635 [蓝桥杯 2016 省 AB] 四平方和

对于一个给定的正整数&#xff0c;可能存在多种平方和的表示法。 要求你对 44个数排序使得 0≤a≤b≤c≤d。 输入 #1复制 5 输出 #1 0 0 1 2 输入 #2 12 输出 #2 0 2 2 2 输入 #3 773535 输出 #3 1 1 267 838 代码 #include<bits/stdc.h> using namespace …...

ElasticSearch是什么?

1.概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计&#xff0c;提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据&#xff0c;并且具备横向扩展能力&#xff0c;能够通过增加更多的硬…...

2024年四非边缘鼠鼠计算机保研回忆(记录版 碎碎念)

Hi&#xff0c;大家好&#xff0c;我是半亩花海。写下这篇博客时已然是金秋十月&#xff0c;心中的石头终于落地&#xff0c;恍惚间百感交集。对于保研这条路&#xff0c;我处于摸着石头过河、冲击、随缘的这些状态。计算机保研向来比其他专业难&#xff0c;今年形势更是艰难。…...

clickhouse常用脚本语句

1.创建库和删除库 drop database IF EXISTS rt_db CREATE DATABASE rt_db ENGINE = Ordinary; CREATE DATABASE rt_db ENGINE = Atomic;2.创建表 CREATE TABLE IF NOT EXISTS intellect_alarm_info ( `id` UInt64 , `client_info_id...

GeneMark软件的秘钥gm_key失效怎么办?

GeneMark软件的gm_key失效怎么办 1. 下载网址&#xff08;为软件的下载界面&#xff09;&#xff1a;http://topaz.gatech.edu/GeneMark/license_download.cgi 2.下载界面 根据自己的需求下载对应的版本和类型的gm_key秘钥 3.填写注册信息 4. 点击下载软件和密钥 5. 将秘钥…...

线性回归逻辑回归-笔记

一、线性回归&#xff08;Linear Regression&#xff09; 1. 定义 线性回归是一种用于回归问题的算法&#xff0c;旨在找到输入特征与输出值之间的线性关系。它试图通过拟合一条直线来最小化预测值与真实值之间的误差。 2. 模型表示 线性回归模型假设目标变量&#xff08;输…...

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 1 部分:Elastic Serverless Forwarder

作者&#xff1a;来自 Elastic Hemendra Singh Lodhi 这是多部分博客系列的第一部分&#xff0c;探讨了将数据从 AWS S3 导入 Elastic Cloud 的不同选项。 Elasticsearch 提供了多种从 AWS S3 存储桶导入数据的选项&#xff0c;允许客户根据其特定需求和架构策略选择最合适的方…...

Linux基础-正则表达式

正则表达式概述 正则表达式是处理字符串的一种工具&#xff0c;可以用于查找、删除、替换特定的字符串&#xff0c;主要用于文件内容的处理。与之不同的是&#xff0c;通配符则用于文件名称的匹配。正则表达式通过使用特殊符号&#xff0c;帮助用户轻松实现对文本的操作。 一…...

【HTML格式PPT离线到本地浏览】

文章目录 概要实现细节小结 概要 最近在上课时总是出现网络不稳定导致的PPT无法浏览的情况出现&#xff0c;就想到下载到电脑上。但是PPT是一个HTML的网页&#xff0c;无法通过保存网页&#xff08;右键另存为mhtml只能保存当前页&#xff09;的形式全部下载下来&#xff0c;试…...

如何在Vue项目中封装axios

文章目录 一、axios简介基本使用 二、封装axios的原因三、封装axios的方法1. 设置接口请求前缀2. 设置请求头和超时时间3. 封装请求方法4. 添加请求拦截器5. 添加响应拦截器小结 一、axios简介 axios 是一个基于 XMLHttpRequest 的轻量级HTTP客户端&#xff0c;适用于浏览器和…...

linux 配置ssh免密登录

一、 cd /root/.ssh/ #不存在就创建mkdir /root/.ssh ssh-keygen #连续按4个回车 ll二、将公钥发送到目标服务器下 #公钥上传到目标服务器 ssh-copy-id root192.168.31.142 #回车完也是要输入密码的 #测试一下免密登录&#xff1a; ssh root192.168.31.142 成功...

【AI绘画】Midjourney进阶:三分线构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;三分线构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midjourney进阶&a…...

享元模式(C++)

定义&#xff1a;享元模式是一种结构型设计模式&#xff0c;它使用共享对象&#xff0c;用以尽可能减少内存使用和提高性能。享元模式通过共享已经存在的对象实例&#xff0c;而不是每次需要时都创建新对象实例&#xff0c;从而避免大量重复对象的开销。 对比&#xff1a; 与单…...

开发一个UniApp需要多长时间

开发一个UniApp所需的时间因项目的规模、复杂度、开发团队的经验水平以及开发过程中的需求变更等多种因素而异。因此&#xff0c;很难给出一个确切的时间范围。然而&#xff0c;我们可以从以下几个方面来大致估算开发时间&#xff1a; 项目规划与需求分析&#xff1a; 在项目开…...

服务器源IP暴露后的安全风险及防御措施

在互联网安全领域&#xff0c;服务器的源IP地址泄露可能成为黑客攻击的切入点。本文将列举十种常见的攻击类型&#xff0c;并提供相应的防御建议&#xff0c;帮助管理员们更好地保护服务器免受潜在威胁。 一、引言 服务器源IP地址的暴露意味着攻击者可以直接针对服务器发起攻击…...

YoloV8改进策略:BackBone改进|CAFormer在YoloV8中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV8模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…...

网络编程(19)——C++使用asio协程实现并发服务器

十九、day19 上一节学习了如果通过asio协程实现一个简单的并发服务器demo&#xff08;官方案例&#xff09;&#xff0c;今天学习如何通过asio协程搭建一个比较完整的并发服务器。 主要实现了AsioIOServicePool线程池、逻辑层LogicSystem、粘包处理、接收协程、发送队列、网络…...

【SQL】深入了解 SQL 索引:数据库性能优化的利器

目录 引言1. 什么是 SQL 索引&#xff1f;1.1 索引的基本概念1.2 索引的优缺点 2. 索引的工作原理2.1 B 树索引2.2 哈希索引2.3 全文索引 3. 索引创建方式3.1 单列索引示意图3.2 复合索引示意图3.3 唯一索引示意图 4. 如何创建索引4.1 创建单列索引4.2 创建唯一索引4.3 创建全文…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...