hot100 -- 滑动窗口

目录

🌼无重复字符 -- 最长子串

AC  滑动窗口(桶)

🌼所有字母异位词

AC  滑动窗口 + 桶

AC  滑动窗口(优化)


🌼无重复字符 -- 最长子串

一开始考虑用 BF暴力 或者 KMP 的,后来想想,KMP 得到的是

主串中子串出现的位置,不适合本题,转而采用双指针 -- 滑动窗口 的思路

AC  滑动窗口(桶)

 O(n) 复杂度,具体思路,样例模拟下

判断重复字符 -- 桶(新建一个bool 数组) 

class Solution {
public:int lengthOfLongestSubstring(string s) {int ans = 0, ret = 0, vis[130] = {0};// i 左指针     j 右指针for (int i = 0, j = 0; j < s.size();) {if (vis[int(s[j])] == 0) { // 子串不存在该字符ans++, ret = max(ret, ans);vis[int(s[j])] = 1; // 出现 1 次j++;}else { // 子串中存在该字符while (vis[int(s[j])] > 0) {vis[int(s[i])]--;i++;ans--;}// 直到重复字符去掉了// 当前字符加入子串ans++, ret = max(ret, ans);vis[int(s[j])]++;j++;}}return ret;}
};

🌼所有字母异位词

AC  滑动窗口 + 桶

坑1 

i 左指针,j 右指针

for 遍历整个字符串 s 时,每次循环末尾,不要忘了减去当前 i 的出现次数,再加上 j + 1 出现次数

坑2

注意 i, j 范围,i 是滑动窗口 左端点,j 滑动窗口 右端点

所以 j < n - 1

O( m + (n - m)*26 )             n -- 字符串 s 长度          m -- 字符串 p 长度

class Solution {
public:vector<int> findAnagrams(string s, string p) {int n = s.size(), m = p.size();// 特判 s 长度 < p 的情况if (n < m || !n)return {}; // 返回空数组int vis[30] = {0}; // p 中出现次数int b[30] = {0}; // 当前 子串 出现次数vector<int> ans; // 返回的答案for (int i = 0; i < m; ++i) vis[p[i] - 'a']++; // 统计 p 中字母出现次数for (int i = 0; i < m; ++i)b[s[i] - 'a']++; // 统计子串字母出现次数// i 左指针      j 右指针for (int i = 0, j = m - 1; j < n; i++, j++) {int flag = 1; for (int t = 0; t < 26; ++t) // 判断是否异位词if (vis[t] != b[t]) {flag = 0; // 不是break;}if (flag)ans.push_back(i);if (j < n - 1) // 防止越界b[s[i] - 'a']--, b[s[j + 1] - 'a']++; // 更新 子串 字母出现次数}return ans;}
};

AC  滑动窗口(优化)

思路 

只需要一个辅助数组 count[], 即 c[],统计每个字母的差值

比如 c[s[i] - 'a']++, c[p[i] - 'a']--;

再借助一个 differ 变量  --  统计 字符串 p 和 滑动窗口,数量不同字母的个数

坑1

 n - m 次 for 循环中,分类讨论时,要小心,differ 分 4 种情况 + / -,而不是 2 种

坑2

越界问题,for 循环中,有 s[j + 1],那么 for ( ; j < n - 1; ) 

坑3

c[x]-- 和 c[y]++ 要分开

因为 x, y 有可能代表同一个字母

O(m + 26 + n) 

class Solution {
public:vector<int> findAnagrams(string s, string p) {int n = s.size(), m = p.size();vector<int> ans;if (n < m || !n) return {}; // 特判int c[30] = {0}; // 每个字母 差值int differ = 0; // 数量不同字母的 个数for (int i = 0; i < m; ++i) { // 前 m 个c[s[i] - 'a']++; // s 中字母出现次数c[p[i] - 'a']--; // p 中字母出现次数}for (int i = 0; i < 26; ++i)if (c[i] != 0) differ++;if (differ == 0)ans.push_back(0); // 初始位置// i 左指针, j 右指针, 滑动窗口for (int i = 0, j = m - 1; j < n - 1; ++i, ++j) { // x 窗口左端点前一个, y 窗口右端点// [i, j] 原来窗口     [i+1, j+1] 新窗口int x = s[i] - 'a', y = s[j + 1] - 'a'; // 错误的↓ -- 卡了半个小时// c[x]--, c[y]++; // 窗口右移,此消彼长c[x]--;if (c[x] == 0) differ--; // 1 -> 0, 不同 -> 同else if (c[x] == -1) differ++; // 0 -> -1, 同 -> 不同c[y]++;if (c[y] == 0) differ--; // -1 -> 0  不同 -> 同else if (c[y] == 1) differ++; // 0 -> 1  同 -> 不同if (differ == 0) ans.push_back(i + 1);}return ans;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彻底解决pycharm中的Python解释器重复-无法重命名和删除不干净的问题

Python解释器重复-无法重命名和删除 问题及原因&#xff1a;PyCharm在删除解释器配置时&#xff0c;并没有完全清除所有相关的配置信息&#xff0c;特别是关于解释器命名的部分。这可能导致即使删除了旧的解释器配置&#xff0c;PyCharm仍然“记住”了之前的命名序号&#xff…

log4j2的使用

基础用法 1. pom文件导入依赖 junit用来做测试 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.5</version></dependency><dependency><groupId>org.…

《Arthas》--问题定位神器--常用指令一图全知

阿丹&#xff1a; 因为一个图太大&#xff0c;直接放出来影响观看&#xff0c;我给他们分开来。 图中关键标识&#xff1a; 基础命令&#xff1a; class相关 jvm相关 字节码增强 ArtHas 基础命令 help 查看命令帮助信息 cls 清空当前屏幕区域 session 查看当前会话的信息 …

vulhub中Apache Log4j Server 反序列化命令执行漏洞复现(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库&#xff0c;其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 1.我们使用ysoserial生成payload&#xff0c;然后直接发送给your-ip:4712端口即可。 java -jar ysoserial-…

【FastAPI】P3 请求与响应

目录 请求路径参数查询参数 响应JSON 响应文本响应返回 Pydantic 模型 在网络通讯中&#xff0c;请求&#xff08;Request&#xff09; 与 响应&#xff08;Response&#xff09; 扮演着至关重要的角色&#xff0c;它们构成了客户端与服务器间互动的根本理念。 请求&#xff0…

数据结构day1

定义一个学生结构体&#xff0c;包含结构体成员&#xff1a;身高&#xff0c;姓名&#xff0c;成绩&#xff1b;定义一个结构体数组有7个成员&#xff0c;要求终端输入结构体成员的值&#xff0c;根据学生成绩&#xff0c;进行冒泡排序。 #include <stdio.h> #include &l…

Bert基础(一)--transformer概览

1、简介 当下最先进的深度学习架构之一&#xff0c;Transformer被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network, RNN)和长短期记忆(long short-term memory, LSTM)网络&#xff0c;并且以它为基础衍生出了诸如BERT、GPT-3、T5等…

请求数据是写在组件的methods中还是在vuex的action中?

作为一名Web前端开发者&#xff0c;我们经常面临一个重要决策&#xff1a;将请求数据写在组件的methods中还是在Vuex的action中。这个问题涉及到了组件的数据流管理和代码结构的设计&#xff0c;不同的方案对于项目的可维护性和扩展性都有着不同的影响。 首先&#xff0c;让我…

普通人如何开启真正的赚钱之路

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

【PHP】web服务器支持PHP_环境配置

一、PHP运行目前为止主要有4方式 &#xff08;1&#xff09;以模块加载的方式运行&#xff0c;初学者可能不容易理解&#xff0c;其实就是将PHP集成到Apache服务器&#xff0c; 以同一个进程运行。 &#xff08;2&#xff09;以CGI的方式运行&#xff0c;CGI英文叫…

Maven(基础)、MyBatis

简介 Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型 (POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建、报告和文档 官网: http://maven.apache.org/ Maven作用 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#x…

ChatGPT在数据分析岗位了解阶段的应用

ChatGPT在数据分析岗位了解阶段的应用 ​ 1.1 数据分析师的职责与技能要求 ​ 如果想成为数据分析师&#xff0c;首先要了解这个岗位的具体职责和技能要求。这个问题可以直接询问ChatGPT&#xff1a; ​ ChatGPT收到上述内容后&#xff0c;返回如下结果。 ​ ChatGPT给出的信…