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

server/2024/10/19 2:22:08/

> 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


http://www.ppmy.cn/server/131195.html

相关文章

【实时计算 Flink】检查点和快照超时的诊断方法与调优策略

Flink的状态管理是一个复杂而关键的领域&#xff0c;涉及到作业的性能、稳定性和资源利用等多个方面。通过对状态生成机制和优化策略地深入理解与正确应用&#xff0c;结合实时计算Flink版提供的产品能力&#xff0c;可以帮您有效地优化Flink作业以应对大规模状态作业带来的挑战…

线性回归:深入解析与实践

线性回归方程&#xff1a;核心与扩展 线性回归方程的基本形式为y w0 w1*x1 w2*x2 ... wn*xn&#xff0c;其中y代表因变量&#xff0c;x1, x2, ..., xn代表自变量&#xff08;或特征&#xff09;&#xff0c;而w0, w1, w2, ..., wn则是我们需要求解的回归系数&#xff08;…

有了WPF后Winform还有活路吗?

近年来&#xff0c;随着技术的不断发展&#xff0c;Windows Presentation Foundation&#xff08;WPF&#xff09;和Windows Forms&#xff08;WinForms&#xff09;这两种技术在开发桌面应用程序方面一直备受关注。虽然WPF以其强大的功能和灵活性吸引了众多开发者&#xff0c;…

对ElementPlus的el-select二次封装,添加分页和搜索功能,实现一个自定义的下拉选择框

组件展示效果图 在 Vue3 的 elementPlus项目中&#xff0c;我们经常需要使用下拉选择框 (el-select) 来展示大量数据。然而&#xff0c;默认情况下 el-select 不支持分页和搜索功能。本文将介绍如何通过二次封装 el-select 组件来实现这一需求&#xff0c;并使用自定义的 Hook …

基于IDEA+SpringBoot+Vue+Uniapp的投票评选小程序系统的详细设计和实现

2. 详细视频演示 文章底部名片&#xff0c;联系我获取更详细的演示视频 3. 论文参考 4. 项目运行截图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框…

ES6语法有哪些

ES6语法包括let和const声明、箭头函数、模板字符串、解构赋值、扩展运算符、类和模块化等。以下是这些特性的具体介绍&#xff1a; let和const声明 let声明&#xff1a;let允许程序员在块级作用域内声明变量&#xff0c;这意味着变量只在其定义的代码块&#xff08;由大括号包围…

MySQL中表的操作

目录 一、查看所有表 1.1、语法 二、创建表 2.1、语法 2.2、示例&#xff1a; 2.3、创建数据加时使⽤校验语句[if not exists] 三、查看表结构 3.1、语法 3.2、示例 四、删除表 4.1、语法 4.2、示例 4.3、注意事项 五、主要数据类型 5.1、数值类型 5.2、日期和…

移动技术开发:保存密码和自动登录

1 实验名称 保存密码和自动登录 2 实验目的 掌握利用SharedPreference实现记住密码和自动登录功能。 3 实验源代码 布局文件代码&#xff1a; &#xff08;1&#xff09;activity_main.xml <?xml version"1.0" encoding"utf-8"?> <TableLa…