【中等】机试-滑动窗口(双指针)-例:无重复字符的最长子串

news2024/11/15 15:28:38

※高频、重点

字节(飞书)、百度等大厂测开高频面试题:最长不重复子串

. - 力扣(LeetCode)字节飞书面经里的高频题,没做出来,需要好好复习。

重点考察-滑动窗口这个概念,自学记录一下:

一、滑动窗口

滑动窗口本质是双指针。处理连续的 子 字符串/数组,如最长最短等问题。(下图以最长不重复子串为例子)

如上图,核心思想就是满足条件的话,让黑色指针右移动;如果当前条件不满足,白色指针右移动。同时可以记录最长长度。

当黑色指针无法移动时,白色指针移动,白指针移动后如果黑色能移动就移动黑色。同时一个变量记录最大长度。

同时,为了满足这种关系,需要用到set数据结构(不可有重复元素)

此类问题核心代码模板:

/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;
    
    int left = 0, right = 0;
    int valid = 0;   //其中 valid 变量表示窗口中满足 need 条件的字符个数,,如果 valid 和 need.size 的大小相同,则说明窗口已满足条件,已经完全覆盖了串 T。

    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        // 右移窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        
        // 判断左侧窗口是否要收缩
        while (window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            // 左移窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}

二、实战

2.1字节(飞书)\百度一面:最长不重复子串-(再练习)

题目链接在开头,做为测开面试常见手撕题,必须要会做。

(0914学习了滑动窗口概念和set用法后才做出来了,需要再练),注意其中的set用法

set<char> ans;//根据类型定义,像vector

ans.count()//检查某个元素是否在set里,1在0不在

ans.insert();//插入元素

ans.erase()//删除某个指定元素

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int max1=0;//最小长度是0,空字符串情况
        int black=0,white=0;
        set<char> ans;

        while(black!=int(s.length())){
            if(!ans.count(s[black])){//如果不存在,存里面,black++
                ans.insert(s[black]);
                black++;
                max1=max(max1,int(ans.size()));
            }else{//存在的话删掉首部的,white++
                ans.erase(s[white]);
                white++;
            }
        }
        return max1;
    }
};

2.2哔哩哔哩:14、牛客:最长无重复子数组

最长无重复子数组_牛客题霸_牛客网 同类题,只不过字符串换成了数组,上面一道能做出来这道题也能做出来

class Solution {
public:
    int maxLength(vector<int>& arr) {
        int black=0,white=0;
        set<int> s;
        int max1=0;
        while(black!=arr.size()){
            if(!s.count(arr[black])){
                s.insert(arr[black]);
                black++;
                max1=max(max1,int(s.size()));
            }else{
                s.erase(arr[white]);
                white++;
            }
        }
        return max1;
    }
};

2.3 力扣上同类高频题:438. 找到字符串中所有字母异位词-不会,回头在练习

 相当于,输入一个串 S,一个串 P,找到 S 中所有 P 的排列,返回它们的起始索引

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        unordered_map<char,int> need,window;
        vector<int> ans;
        for(char c:p){
            need[c]++;
        }

        int left=0,right=0;
        int v=0;

        while(right<int(s.length())){
            char c=s[right];
            right++;

            if(need.count(c)){
                window[c]++;
                if(window[c]==need[c]){
                    v++;
                }
            }

            while(right-left>=int(p.length())){ //left右移,缩框
                if(v==need.size()){
                    ans.push_back(left);
                }

                char d=s[left];
                left++;

                if(need.count(d)){
                    if(window[d]==need[d]){
                        v--;
                    }
                    window[d]--;
                }
            }
        }
        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻击者如何在日常网络资源中隐藏恶意软件

近二十年来&#xff0c;安全 Web 网关 (SWG) 一直在监控网络流量&#xff0c;以检测恶意软件、阻止恶意网站并保护企业免受基于 Web 的威胁。 然而&#xff0c;攻击者已经找到了许多绕过这些防御措施的方法&#xff0c;SquareX的安全研究人员对此进行了记录。 最危险的策略之…

【Linux】调试和Git及进度条实现

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;Linux入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1.…

LinkedHashMap 如何实现排序

目录 一、LinkedHashMap二、排序实现三、代码片段分析 一、LinkedHashMap LinkedHashMap 是 Java 中的一个集合类&#xff0c;它是 HashMap 的一个子类&#xff0c;继承了 HashMap 的所有特性&#xff0c;并且在此基础上增加了一个双向链表来维护元素的插入顺序或者访问顺序。L…

java的内存分配和回收机制

Java 与 C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙&#xff0c;墙外面的人想进去&#xff0c;墙里面的人却想出来。 概述 垃圾收集&#xff08;GC&#xff09;需要完成的三件事情&#xff1a; 哪些内存需要回收&#xff1f;什么时候回收&#xff1f;如何回收&am…

CloudXR 套件扩展 XR 工作流

NVIDIA为开发者提供了一个先进的平台&#xff0c;开发者可以在该平台上使用全新NVIDIA CloudXR 套件来创建可扩展、品牌化的定制扩展现实&#xff08;XR&#xff09;产品。 NVIDIA CloudXR 套件基于全新架构而打造&#xff0c;是扩展XR生态的重要工具。它为开发者、专业人士和…

高级 API 性能:着色器

着色器通过使您能够控制渲染过程的各个方面&#xff0c;在图形编程中发挥着关键作用。它们在 GPU 上运行&#xff0c;负责操作顶点、像素和其他数据。 常规着色器计算着色器像素渲染顶点着色器几何体、域和外壳着色器 常规着色器 这些提示适用于所有类型的着色器。 推荐 避…

[产品管理-10]:NPDP新产品开发 - 8 - 波士顿矩阵(当下与未来)在产品市场战略方面的应用

目录 一、波士顿矩阵 理论基础 产品类型划分 分析步骤 重要性 注意事项 二、波士顿矩阵的应用实例 示例背景 数据收集与准备 绘制波士顿矩阵 产品线分类 制定战略对策 一、波士顿矩阵&#xff1a;现在 VS 未来 波士顿矩阵理论&#xff0c;又称市场增长率-相对市场份…

读构建可扩展分布式系统:方法与实践04应用服务

1. 应用服务 1.1. 任何系统的核心都在于实现应用需求的特定业务逻辑 1.2. 服务是可扩展软件系统的核心 1.2.1. 它们将契约定义为一个API&#xff0c;向客户端声明它们的能力 1.3. 应用服务器高度依赖于编程语言&#xff0c;但通常都会提供多线程编程模型&#xff0c;允许服…

Ubuntu系统使用Docker部署Jupyter Notebook并实现笔记云同步

文章目录 前言1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 前言 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpol…

Netty(零散记录)

Netty&#xff1a; 1、Netty三种IO 2、Netty和Reactor的 1、Netty对Reactor的支持 Netty的线程模型时基于Reactor模型实现的&#xff0c;Netty对Reactor三种模式都有非常好的支持&#xff0c;并做了一定的改善&#xff0c;一般情况下&#xff0c;在服务端会采用主从架构模型…

Leetcode面试经典150题-739.每日温度

应读者私信要求&#xff0c;本题协商题目的具体内容 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0…

计算机毕业设计 二手闲置交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【目标检测数据集】厨房常见的水果蔬菜调味料数据集4910张39类VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4910 标注数量(xml文件个数)&#xff1a;4910 标注数量(txt文件个数)&#xff1a;4910 标注…

SSH公私钥后门从入门到应急响应

目录 1. SSH公私钥与SSH公私钥后门介绍 1.1 SSH公私钥介绍 1.1.1 公钥和私钥的基本概念 1.1.2 SSH公私钥认证的工作原理(很重要) 1.2 SSH公私钥后门介绍 2. 如何在已拿下控制权限的主机创建后门 2.1 使用 Xshell 生成公钥与私钥 2.2 将公钥上传到被需要被植入后门的服务…

Qt_显示类控件

目录 一、QLabel 1、QLabel属性介绍 2、textFormat文本格式 3、pixmap标签图片 3.1 resizeEvent 4、QFrame边框 5、alignment文本对齐 6、wordWrap自动换行 7、indent设置缩进 8、margin设置边距 9、buddy设置伙伴 二、QLCDNumber 1、QLCDNumber属性介绍 2、实…

再次探讨最小生成树Prim算法

二次复习Prim算法时得到了一些新的启示。正常初次学算法时都特别注意代码&#xff0c;但是慢慢的发现&#xff0c;随着代码能力的增强&#xff0c;代码反而不是这么重要&#xff0c;重要的是算法的思路。既在自己的脑子中能有这个算法的图解。 下面展示一下二次学习的思路&…

秋韵虫趣.

文章目录 虫鸣概览虫坛文化蟀种纷呈中华蟋蟀宁阳蟋蟀刻点铁蟋长颚斗蟋 油葫芦棺头蟋中华灶蟋小素蟋树皮蟋蟀 花生大蟋斑腿针蟋其他鸣虫树蟋&#xff0c;又名竹蛉、邯郸梨片蟋&#xff0c;又名金钟、天蛉、绿蛣蛉、银琵琶凯纳奥蟋&#xff0c;又名石蛉&#xff0c;鳞蟋黄蛉蟋&am…

基于A2C与超启发式的航天器星载自主任务规划算法-笔记

1. Actor-Critic 模块 主要文件&#xff1a;AC.py, PolicyNet.py, ValueNet.py作用&#xff1a;该模块实现了 A2C&#xff08;Advantage Actor-Critic&#xff09;强化学习算法。其中&#xff0c;ActorCritic 类是核心&#xff0c;它同时管理策略网络&#xff08;Actor&#x…

misc合集(1)

[Week3] 这是一个压缩包 有密码&#xff0c;提示QmFzZUNURj8/Pz8/P0ZUQ2VzYUI base64解密是BaseCTF??????FTCesaB 猜测这应该是⼀个轴对称的密码 python ⽣成了密码字典&#xff0c;再通过 ARCHPR 进⾏字典爆破 lowercase abcdefghijklmnopqrstuvwxyz uppercase l…

Vue生命周期;Vue路由配置;vue网络请求;vue跨域处理

一&#xff0c;Vue生命周期 <template><div > <h1 click"changeText">{{ info }}</h1></div> </template><script> export default {name: HelloWorld,data(){return{info:"介绍组件生命周期"}},methods:{chang…