优选算法——滑动窗口4(找子串)

🔥近津薪荼: 个人主页 🎬个人专栏: 《近津薪荼的算法日记》 《Linux操作系统及网络基础知识分享》 《c++基础知识详解》 《c语言基础知识详解》 ✨古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。
------ 苏轼


1.上期参考代码

c 复制代码
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
         int left=0,right=0;
         int hash[2]={};
         int length=0;
         while(right<nums.size())
         {
            hash[nums[right]]++;
            while(hash[0]>k)
            {
                hash[nums[left++]]--;
            }
            length= max(right - left+1,length);
            right ++;
            
         }
         return length ;
    }
};

2.本期知识点导图

3.本期要讲解的题目是

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

要点;

  • 找子串
  • 异位词 *同字母排列组合*形成的字符串

怎么快速判断两个字符串是不是异位词?

创建两个哈希表

4.解题

4.1 暴力解法:

  1. 以p的长度n为单位,暴力枚举 s中的 所有n元组。
  2. 把n元组扔进哈希表中统计元素及其个数
  3. 与另一哈希表(统计p )比对
    O(N3) 必然超时

4.2优解

4.1 和之前的思路一样,通过同向双指针,把嵌套for的O(N2) 干成 O(N)

最终复杂度为O(N2):比对哈希表的过程中还有一次遍历 还能优化

优化:

外层循环已经被优化了,我们现在来看内部遍历哈希表的过程能不能优化下,或者说我们换一种方式来维护窗口信息

现在我来尝试用例子来模拟hash统计子串数据:

我们在用hash统计子串数据的过程中,我们发现

我们统计的s中的数据可以分成两类:有效数据和无效数据

并且我们发现,当有效数据的个数和hash1中的数据个数相同,且L=n的时候。此时的子串完全符合要求。

因此,我们要做的事就从遍历对比两个哈希表数据 变成了统计有效数据的个数

因此,我们要创建一个count变量来统计有效数据的个数,并在窗口中不断维护它。

代码逻辑

1. 先用hash1统计p的元素
2. 滑动窗口
- 进窗口:right元素进hash2
- 判断:L>n
- 出窗口 :判断出的元素是否是有效元素,维护count
- 更新信息L=n,count=p.size( );返回left

5.下期要讲解的题目是:

DP34前缀和

下期见。

相关推荐
点心的游戏开发世界1 小时前
Unity C# 脚本学习笔记:命名空间与 using
学习·unity·c#
香芋芋圆2 小时前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
淡海水3 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
点心的游戏开发世界3 小时前
Unity C# 脚本学习笔记:泛型
学习·unity·c#
leobertlan3 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy4 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
tju新生代魔迷4 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习
乐迪信息4 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
我爱cope6 小时前
【计算机网络 | 网络层11:ICMP 协议:Ping 和 Traceroute 的底层原理】
网络·学习·计算机网络