🔥近津薪荼: [个人主页] 🎬个人专栏: 《近津薪荼的算法日记》 《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 暴力解法:
- 以p的长度n为单位,暴力枚举 s中的 所有n元组。
- 把n元组扔进哈希表中统计元素及其个数
- 与另一哈希表(统计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.下期要讲解的题目是:
下期见。
