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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安宝特AR汽车行业解决方案系列1-远程培训

在汽车行业中&#xff0c;AR技术的应用正悄然改变着整个产业链的运作方式&#xff0c;应用涵盖培训、汽修、汽车售后、PDI交付、质检以及汽车装配等&#xff0c;AR技术为多个环节都带来了前所未有的便利与效率提升。 安宝特AR将以系列推文的形式为读者逐一介绍在汽车行业中安宝…

【机器学习笔记】 15 机器学习项目流程

机器学习的一般步骤 数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序&#xff0c;包括检查数据一致性&#xff0c;处理无效值和缺失值等。与问卷审核不同&#xff0c;录入后的数据清理一般是由计算机而不是人工完成。 探索性数据分析(EDA 探索性数据…

PROBIS铂思金融破产后续:ASIC牌照已注销

2024年1月31日&#xff0c;PROBIS铂思金融的澳大利亚ASIC牌照 (AFSL 338241) 被注销《差价合约经纪商PROBIS宣布破产&#xff0c;澳大利亚金融服务牌照遭暂停》&#xff0c;这也就意味着&#xff0c;PROBIS铂思金融目前已经没有任何金融牌照。 值得注意的是&#xff0c;时至今日…

com.alibaba.fastjson.JSONException: toJSON error的原因

问题&#xff1a; 导出接口报错&#xff0c;显示json格式化异常 发现问题&#xff1a; 第一个参数为HttpResponse,转换成json的时候报错 修改方法&#xff1a; 1.调换两个参数的位置 2.在aop判断里边 把ServletAPI过滤掉 Before("excudeWebController()")pub…

解决NPM安装依赖包卡住的问题

引言 最近研究前端的一些技术点&#xff0c;在使用npm安装依赖包的时候发现会卡住&#xff0c;时间超时后会报如下错误 npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/babel/parser/download/babel/…

国际语言代码 Language Code 对照表速查

前言 语言代码是英国教育社会学家伯恩斯坦的术语。指在一定的语言集团中&#xff0c;特定的人群在特定的社会环境下使用的特定的言语。分为限定代码&#xff08;restricted code&#xff09;和精制代码&#xff08;elaborated code&#xff09;。语言代码是由字母或数字组成的…

Elasticsearch:将 IT 智能和业务 KPI 与 AI 连接起来 - 房间里的大象

作者&#xff1a;Fermi Fang 大象寓言的智慧 在信息技术和商业领导力的交叉点&#xff0c;蒙眼人和大象的古老寓言提供了一个富有洞察力的类比。 这个故事起源于印度次大陆&#xff0c;讲述了六个蒙住眼睛的人第一次遇到大象的故事。 每个人触摸大象的不同部位 —— 侧面、象牙…

java中的多线程(五)线程变量ThreadLocal

一、介绍 1、介绍&#xff1a; package java.lang; public class ThreadLocal<T> ThreadLocal中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本&am…

前中后三缀表达式

中缀表达式&#xff1a; 就是我们平常写的数学式 例如&#xff1a;a*(bc)-d 前缀表达式&#xff1a; 是指将符号位提前&#xff0c;注意计算顺序 如&#xff1a;上例计算顺序&#xff1a;(&#xff08;a*(bc))-d) 转换为前缀表达式为&#xff1a;-*abcd 后缀表达式&…

【lesson60】网络基础

文章目录 网络发展认识协议网络协议初识OSI七层模型TCP/IP五层(或四层)模型网络传输基本流程数据包封装和分用网络中的地址管理 网络发展 以前没有网络剧的工作模式是&#xff1a;独立模式:&#xff0c;计算机之间相互独立 所以多个计算机要协同开发比较难。 有了网络以后&am…

Linux系统——I/O模型

目录 1.I/O定义 2.I/O模型相关概念 3. 总结 1.I/O定义 I/O在计算机中指Input/Output&#xff0c; IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数)&#xff0c;是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量&#xff0c;一般以…

【毕业设计推荐】基于MATLAB的水果分级系统设计与实现

一、课题介绍 现在商业行为中&#xff0c;在水果出厂前都需要进行质量检测&#xff0c;需要将不同等级的水果进行分级包装&#xff0c;以保证商业利益最大化。可是传统方法都是依靠人工进行检测&#xff0c;效率低下&#xff0c;主观成分大&#xff0c;并不能很好客观地评价出货…

YAPI接口自动鉴权功能部署详解

安装准备 以下操作&#xff0c;默认要求自己部署过yapi&#xff0c;最好是部署过yapi二次开发环境。 无论是选择在线安装或者是本地安装&#xff0c;都需要安装client工具。 1、yapi-cli&#xff1a;npm install yapi-cli –g&#xff0c; 2、安装后将文件夹nodejs/node_gl…

VTK通过线段裁剪

线段拆分网格 void retrustMesh(vtkSmartPointer<vtkPolyData> polydata, vtkSmartPointer<vtkPoints> intermediatePoint) {vtkSmartPointer<vtkPoints> srcPoints polydata->GetPoints();int pointSize intermediatePoint->GetNumberOfPoints();/…

搜维尔科技:分析OptiTrack光学动作捕捉应用领域!

虚拟制作 当今虚拟制作阶段低延迟、超精确摄像机跟踪的事实上的标准。 用于运动科学的 OptiTrack OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程&#xff0c;为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。对所有主要数字测力台、EMG 和模拟设备的本机即…

基于STM32F407的coreJSON使用教程

目录 概述 工程建立 代码集成 函数介绍 使用示例 概述 coreJSON是FreeRTOS中的一个组件库&#xff0c;支持key查找的解析器&#xff0c;他只是一个解析器&#xff0c;不能生成json数据。同时严格执行 ECMA-404 JSON 标准。该库用 C 语言编写&#xff0c;设计符合 ISO C90…

书生浦语大模型实战营-课程笔记(5)

LLM部署特点&#xff0c;内存开销大&#xff0c;TOKEN数量不确定 移动端竟然也可以部署LLM。之前以为只能在服务端部署&#xff0c;移动端作为客户端发起请求来调用大模型。 LMDeploy用于模型量化 模型量化&#xff1a;降低内存消耗 推理性能对比 量化主要作用&#xff1a;…

推荐一个内网穿透工具,支持Windows桌面、Linux、Arm平台客户端

神卓互联是一款常用的内网穿透工具&#xff0c;它可以将本地服务器映射到公网上&#xff0c;并提供域名或子域名给外部访问。神卓互联具有简单易用、高速稳定的特点&#xff0c;支持Windows桌面版、Linux版、Arm版客户端&#xff0c;以及硬件等。 神卓互联内网穿透技术简介 企…

JAVA--异常处理

目录 1. 异常概述 1.1 什么是生活的异常 1.2 什么是程序的异常 1.3 异常的抛出机制 1.4 如何对待异常 2. Java异常体系 2.1 Throwable 2.2 Error 和 Exception 2.3 编译时异常和运行时异常 3. 常见的错误和异常 3.1 Error 3.2 运行时异常 3.3 编译时异常 4. 异常…

阿里云ECS服务器如何选择操作系统?

阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文版&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…