最短超串-滑动窗口

程序员面试金典 – 面试题 17.18. 最短超串(双指针+哈希) 1. 题目 假设你有两个数组,一个长一个短,短的元素均不相同。 找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。 若不存在,返回空数组。 示例 1: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,10] 示例 2: 输入: big = [1,2,3] small = [4] 输出: [] 提示: big.length <= 100000 1 <= small.length <= 100000 来源:力扣 立即下载
class Solution {
    public int[] shortestSeq(int[] big, int[] small) {
        //左右双指针表示滑动窗口,start和min用来保存最优解
        int left = 0,right = 0,start = 0;
        int min = Integer.MAX_VALUE;
        //window用来记录当前窗口包含的字符和出现的次数
        //needs用来记录small当中出现的字符和包含的次数
        HashMap<Integer,Integer> window = new HashMap<>();
        HashMap<Integer,Integer> needs = new HashMap<>();
        //记录small中出现的字符和包含的次数
        for(Integer c:small ) needs.put(c,needs.getOrDefault(c,0)+1);
        //match用来保存匹配的个数
        int match = 0;
        //移动right扩大窗口
        while(right<big.length){
            Integer c1 = big[right];
            if(needs.containsKey(c1)){
                window.put(c1,window.getOrDefault(c1,0)+1);
                if(window.get(c1)==needs.get(c1)){
                    match++;
                }
            }
            right++;
            //当匹配个数满足small时,移动 left 缩小窗口进行优化
            while (match==needs.size()){
                //更新最小窗口
                if(right-left<min){
                    start = left;
                    min = right-left;
                }
                Integer c2 = big[left];
                if(needs.containsKey(c2)){
                    window.put(c2,window.getOrDefault(c2,0)-1);
                    if(window.get(c2)<needs.get(c2)){
                        match--;
                    }
                }
                left++;
            }
        }
        return min == Integer.MAX_VALUE? new int[0]:new int[]{start,min+start-1};
    }
}

以上代码是参考以为大佬的,可以说是非常详细了,下面的是在笔试中写的,用例测试通过率居然为0,(估计是凉了)

public class minSubstring {

 

    public int minLength(String str1, String str2){

        if(str1 == null || str2 ==null || str1.length() < str2.length()){

            return 0;

        }

        char[] chas1 = str1.toCharArray();

        char[] chas2 = str2.toCharArray();

        int[] map = new int[256];

        for (int i=0; i< chas2.length; i++){

            map[chas2[i]]++;

        }

        int left= 0;

        int right = 0;

        int minLen =Integer.MAX_VALUE;

        int match =chas2.length;

        while (right != chas1.length){

            map[chas1[right]]--;

            if(map[chas1[right]] >= 0){

                match--;

            }

            if(match == 0){

                while (map[chas1[left]] < 0){

                    map[chas1[left++]]++;

                }

                minLen = Math.min(minLen, right - left + 1);

                match++;

                map[chas1[left++]]++;

            }

            right++;

        }

        return minLen == Integer.MAX_VALUE ? 0 :minLen;

    }

 

    public static void main(String[] args){

        minSubstring tmp = new minSubstring();

 

        String str1 = "abcde";

        String str2 = "ac";

        System.out.println(tmp.minLength(str1, str2));

 

        String str3 = "12345";

        String str4 = "344";

        System.out.println(tmp.minLength(str3, str4));

    }

}


 

开源libmodbus编译为32位和64位动态库 libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。 阅读详情

相关推荐

Docker部署 SRS rtmp/flv流媒体服务器

SRS(Simple Realtime Server)是一款开源的流媒体服务器,具有高性能、高可靠性、高灵活性的特点,能够支持直播、点播、转码等多种流媒体应用场景。SRS 不仅提供了流媒体服务器,还提供了适用于多种平台的客户端 SDK 和在线转码等辅助服务,是一款十分强大的流媒体解决方案。

m0_56659620的博客 4869

滑动窗口法

首先要思考如果用一个for循环,那么应该表示滑动窗口的起始位置,还是终止位置。如果只用一个for循环来表示滑动窗口的起始位置,那么如何遍历剩下的终止位置?给定一个含有n个正整数的数组和一个正整数target,找出该数组中满足其和≥target的长度最小的连续子数组,并返回其长度。窗口的起始位置如何移动如果当前窗口的值大于target了,窗口就要向前移动了(也就是该缩小了)。窗口的结束位置如何移动窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。下面来看看滑动窗口的方法。..............

wangzai32100的博客 824

从AP到ADSP:高通8650 AudioReach中GSL-Passthru-GPR的数据通路剖析

本文深入剖析了高通骁龙8650平台AudioReach架构中,音频数据从应用处理器(AP)到音频数字信号处理器(ADSP)的完整传输路径。重点解析了GSL(Graph Service Layer)如何封装命令,并通过Passthru驱动与GPR(Generic Packet Router)协同工作,实现跨处理器的高效、异步数据交换,揭示了现代手机复杂音频系统背后的核心通信机制。

cherry的博客 536

Leetcode之面试题17.18——最短超串

题目: 假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。 示例 1: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,10] 示例 2: 输入: big = [1,2,3] small = [4] 输出: [] 提示: big.lengt

qq_35455503的博客 471

【搭建实战】全国天气预报看板搭建

不仅如此,码匠还一站式提供了企业内部系统常用的租户管理、细粒度的权限控制、审计日志等功能,让您快速搭建后台应用的同时,也为您的企业信息安全保驾护航。是一款国内研发的开发者友好的低代码平台,您无需了解React/Vue等框架的开发、部署等各种细节,就可以快速打通前后端,连接RESTAPI、MySQL、MongoDB等多种数据源,然后通过一套开箱即用的组件,轻松搭建功能完善的数据看板、数据洞察、Admin管理后台等多种应用。天气预报对我们的各项活动有很大的帮助,可以让我们合理安排自己的出行等活动。...

weixin_39545889的博客 428

DMTF相关协议(一):Redfish和SMBIOS

Redfish 是一种管理标准,使用超媒体 RESTful 接口中的数据模型表示。该模型以标准的、机器可读的模式表示,消息的有效负载以 JSON 表示。该协议本身利用了 OData v4。由于它是一个超媒体 API,因此能够通过一致的接口表示各种实现。它具有管理数据中心资源、处理事件、长时间任务和发现的机制。

weixin_44032634的博客 2265

【leetcode】面试题1:最短超串,详解滑动窗口

假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。 示例 1: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,10] 示例 2: 输入: big = [1,2,3] small = [4] 输出: [] 提示: big.length <=

xintu1314的博客 507

Box2D-Lite源码阅读笔记(2)

0.初始化函数 static void InitDemo(int index) { world.Clear(); numBodies = 0; numJoints = 0; bomb = NULL; demoIndex = index; demos[index](bodies, joints); } 在这个初始化函数中,一般会默认执行index=0的函数,这个函数就是一个示例,因为示例比较简单,所以也便于研究,示例效果如下。 就是一个方块。 进入第一个示例函数。(忽略我加的注释)

ARTELE的博客 976

面试题 17.18. 最短超串(滑动窗口)

1. 问题描述: 假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。 示例 1: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,1...

二哈 612

嵌套交叉验证的‘双循环’哲学:为什么你的模型评估总是不准?

本文深入探讨了嵌套交叉验证(Nested Cross-Validation)在机器学习模型评估中的关键作用,揭示了传统交叉验证方法存在的偏差问题。通过双重循环设计,嵌套交叉验证有效隔离数据,提供无偏评估,显著提升模型在真实场景中的性能预测准确性。文章还提供了工程实践中的优化策略和量化分析,帮助开发者在计算成本与评估精度之间找到平衡。

b3n4m5q6w7的博客 225

超级超级细的CLIP官方模型解读及代码逐行讲解

本文详细解析了OpenAI开源的CLIP模型代码架构。文章首先介绍模型概念,包括训练时通过对称损失计算图像-文本相似度,预测时通过余弦相似度匹配最佳文本。随后重点解析各模块代码实现:LayerNorm改进、QuickGELU激活函数、Transformer编码器结构、ViT图像编码器的特征提取过程、文本编码器的掩码机制和特征投影。最后阐述CLIP整体架构如何整合视觉和文本编码器,并详细说明了特征归一化和相似度计算的关键实现。全文通过代码级解读帮助读者深入理解CLIP模型的实现细节。

m0_64595440的博客 2425

【坚持每日一题9.16】最短超串

假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。 示例 1: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,10] 示例 2: 输入: big = [1,2,3] small = [4] 输出: [] java代码: class Solution

kangbin825的专栏 228

触摸芯片RM1015B基本使用方法

RM1015B触摸芯片使用指南:该芯片采用4通道设计(实际使用3通道),通过I2C接口通信(设备地址0x2B)。硬件设计需注意中断/复位引脚复用,需上拉处理。软件配置包括初始化、中断处理和定时器扫描,通过设置各通道阈值(0-300W)调节灵敏度,值越小越灵敏。调试时可调用rm1015B_debug_func()输出波形数据。典型应用场景包括接近检测和手势识别,中断触发后需在8ms内响应。特别注意不同通道的寄存器映射关系及校准流程,确保检测准确性。

云淡风轻 176

滑动窗口 力扣最短超串

最近遇到两道滑动窗口的题都没有解出来,借此来学习这个早已熟悉却不怎么会用的概念。 Sliding Window:其实看到类似满足xx的最小区间的子串这类问题自然可以想到滑动窗口。 一般滑动窗口要维护两个指针,l,r 1.当窗口内到元素未达到条件时, r++ 2.当窗口内到元素达到条件时,l++ function slideWindow(nums){ let n = nums.length() let l = 0, r = 0, ans = 0 while(r < n){ while(nums

麦芒的博客 181

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

最短超串(滑动窗口解法)

面试题 17.18. 最短超串 假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。 示例 1: 输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,10] 示例 2: 输入: big = [1,2,3] small = [4] 输出: [] 代码如

m0_48810566的博客 489

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【程序员面试金典】面试题 17.18. 最短超串

【程序员面试金典】面试题 17.18. 最短超串

❀雾里看花花里看雾❀ 620

leetcode面试题 17.18. 最短超串题解(滑动窗口问题)

解题思路 labuladong算法小抄里面滑动窗口C++解法的java版。 1.把[left,right]称为一个窗口; 2.先右移右指针扩大窗口,直到窗口中的数字满足small数组要求; 3.满足要求时,停止增加right,转而增加left缩小窗口,直到不满足要求 4.重复2,3步直到right走到big尽头 Talk is cheap, show me the code. 代码 class S...

MRcheng12138的博客 430

每日一道Leetcode - 面试题 17.18. 最短超串 [滑动窗口]

class Solution: def shortestSeq(self, big: List[int], small: List[int]) -> List[int]: value = N_small = len(small) N_big = len(big) dic = dict() for num in small: if num not in dic: dic[nu.

weixin_41041275的博客 183

leetcode 面试题17.18 最短超串(滑动窗口模板)

题目描述: 假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。 思路: 首先确定左边界,然后右边界开始右移,直到找到满足所有字符的子串; 然后左边尽可能左移,使得子串的长度最小; 记录当前的开始位置和长度 之后左边界右移,开始寻找下一个满足所有字符的窗口 代码如下: class Solution { public: vector&l

peachzy的博客 177

【数据结构与算法】滑动窗口

假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。示例 1:输入: big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7] small = [1,5,9] 输出: [7,10] ---5,7,9,1解题思路:滑动窗口,消减法。

贾斯丁的博客 363

滑动窗口例题

滑动窗口,可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“请找到满足xx的最x的区间(子串、子数组)的xx”这类问题都可以使用该方法进行解决。

weixin_41636858的博客 465

python-leetcode-面试题 17.18. 最短超串

所有元素的最短子数组。这个问题的最佳解法是。

Lucy_wzw的博客 370

5.22 力扣 滑动窗口 前缀和应用 单调栈(768)

1248. 统计「优美子数组」 法一:滑动窗口 例如 nums=[1,2,1,1,2,2,1,2,1],k=2 stack=[0,1,3,4,7,9],0和9是增加的边界 当i=1,符合条件的最小数组是第一个1和第三个1之间,即 nums[0]-nums[2],则左边界的可能的点是stack[1]-stack[0],右边界可能的点是stack[i+k]-stack[i+k-1]即(stack[3]-stack[2]) class Solution: def numberOfSubarrays(s

t1471464672的博客 425

Leetcode-滑动窗口

Leetcode-滑动窗口滑动窗口模板及例题例题理解相关例题Leetcode 1208.尽可能使字符串相等Leetcode 3.无重复字符的最长字串Leetcode 1934 最短超串 滑动窗口模板及例题 滑动窗口为了解决时间复杂度而提出的一种优化方法,一般可以在O(n)的时间复杂度下解决O(n2)的问题,因此这里进行提供模板,以及Leetcode例题方便读者进行理解。 例题理解 下面我们首先给出一道Leetcode中的例题来进行理解,并给出解题模板。 Leetcode 最长连续子串 题目要求 给定一个字符

m0_50536492的博客 442

算法探秘:消失的数字与最短超串——空间与时间的极限博弈

在算法的宇宙中,有些问题如幽灵般隐匿于数据洪流,有些则如闪电般稍纵即逝。今天,我们将解锁两个经典谜题:消失的两个数字:从1到N的完美序列中,两个数字神秘蒸发。如何在O(N)时间、O(1)空间内揪出它们?最短超串:在10万级的长数组中,如何用O(n)时间捕捉包含所有目标元素的最短子数组?它们一个是空间压缩的极致艺术,一个是时间效率的巅峰之舞。无需代码,只需逻辑的显微镜,我们一同解剖这两大算法奇观!问题场景 想象一个本应包含1到N的数组,却因数据虫洞吞噬了两个数字。给定残缺数组(长度=N-2),在O(N)时间、

司徒鸿的博客 926

LeetCode 面试题 17.18. 最短超串

另一种对蛮力方法的考虑是,我们取每个起始索引,在目标字符串中寻找每个元素的下一个出现位置。你应该能够将其降低到O(SB)的时间和O(B)的空间(其中B是较大数组的大小,S是较小数组的大小)。考虑一下前面解释的蛮力解法。假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。一种蛮力解决方案是对于每个起始位置不断向前移动,直到你找到一个包含所有目标字符的子序列为止。

m0_56090828的博客 390

滑动窗口

76. 最小覆盖子串 76. 最小覆盖子串 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 1.构建一个滑动窗口,左右指针怎么移动?右指针移动:当窗口内的内容不满足条件 左指针:当窗口内的指针满足条件 class Solutio.

北歌的博客 503
上一篇: 消息中间件Active MQ
下一篇: Java面试(一)
Alt__
博客等级 码龄7年 16粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值