首页 > 其他分享 >hot100-一刷-03滑动窗口(共2道题)

hot100-一刷-03滑动窗口(共2道题)

时间:2024-12-03 15:56:10浏览次数:8  
标签:03 set right int ++ 道题 hot100 ans left

3. 无重复字符的最长子串

题目链接

题目描述

image

代码实现

分析:因为是要连续的序列,使用滑动窗口 + Set集合来判断即将要加入窗口右端的元素是已经在窗口中出现过。

代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int ans = 0;

        // Set去重
        Set<Character> set = new HashSet<>();
        // 滑动窗口
        char[] chars = s.toCharArray();

        int left = 0;
        int right = 0;

        for (; right < s.length(); right++){
            // left < right 也可以不加。 最坏的情况,是left在right前一位
            // 相当于先把该元素移出set, while外又加进set,并且此时left=right, for里right再++
            while(left < right && set.contains(chars[right])){
                set.remove(chars[left]);
                left++;
            }
            set.add(chars[right]);
            // 更新每一轮添加元素时的最大子串长度
            ans = Math.max(ans, right - left + 1);
        }
        return ans;
    }
}

模板

题解区有人提到滑动窗口的模板题,

//外层循环扩展右边界,内层循环扩展左边界
for (int l = 0, r = 0 ; r < n ; r++) {
	//当前考虑的元素
	while (l <= r && check()) {//区间[left,right]不符合题意
        //扩展左边界
    }
    //区间[left,right]符合题意,统计相关信息
}
// ----------------------------------------
class Solution {
    public int lengthOfLongestSubstring(String s) {
        //滑动窗口
        char[] ss = s.toCharArray();
        Set<Character> set = new HashSet<>();//去重
        int res = 0;//结果
        for(int left = 0, right = 0; right < s.length(); right++) {//每一轮右端点都扩一个。
            char ch = ss[right];//right指向的元素,也是当前要考虑的元素
            while(set.contains(ch)) {//set中有ch,则缩短左边界,同时从set集合出元素
                set.remove(ss[left]);
                left++;
            }
            set.add(ss[right]);//别忘。将当前元素加入。
            res = Math.max(res, right - left + 1);//计算当前不重复子串的长度。
        }
        return res;
    }
}

438. 找到字符串中所有字母异位词

题目链接

题目描述

image

代码实现

分析:
初始化时维护一个pLen大小的窗口,使用数组来记录字母出现的次数。
代码:

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        // s 长度小于 p 必然不行
        if(s.length() < p.length()) return new ArrayList<>();
        
        List<Integer> ans = new ArrayList<>();
        int[] arrS = new int[26];
        int[] arrP = new int[26];
    
        // 初始化时维护一个pLen大小的窗口
        for(int i = 0; i < p.length(); i++){
            // 记录p里所有字母出现的次数
            arrP[p.charAt(i) - 'a']++;
            arrS[s.charAt(i) - 'a']++;
        }
        if(Arrays.equals(arrP,arrS)){
            ans.add(0);
        }

        for(int i = 0; i < s.length() - p.length(); i++){
            // 头出
            arrS[s.charAt(i) - 'a']--;
            // 尾进
            arrS[s.charAt(i + p.length()) - 'a']++;
            // 新头满足则添加到ans,不满足就再判断下一轮
            if(Arrays.equals(arrP,arrS)){
                ans.add(i+1);
            }
        }
        return ans;
    }
}

标签:03,set,right,int,++,道题,hot100,ans,left
From: https://www.cnblogs.com/chendsome/p/18580300

相关文章

  • git报错403怎么解决
    Git报错403及解决1询问AI主要有以下可能原因:通用的SSH配置见文章:gitssh密钥配置以下是我针对我的笔记本情况请进行的配置:创建SSH:(不要用中文,管理员权限打开PowerShell运行下面的命令,地址可以自定义)ssh-keygen-trsa-b4096-C"2919356315@qq.com"-f"C:/Users/lzh......
  • 【每日一题】20241203
    【每日一题】如图所示,将物块\(a\)分别放入光滑的\(A\)轨道和\(B\)轨道的最高点,以零初速度滑至轨道的最低点所用时间分别为\(t_1\)与\(t_2\).则已知\(A\)轨道与\(B\)轨道完全一至,则A.\(t_1>t_2\)B.\(t_1<t_2\)C.\(t_1=t_2\)D.\(t_1\geqt_2\)E.\(t_1\l......
  • 1303 [POJ 1830] 开关问题
    //1303[POJ1830]开关问题.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/1080有n个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生......
  • 【漏洞复现】Bazaar 任意文件读取漏洞(CVE-2024-40348)
    免责声明请勿使用本文中提到的技术进行非法测试或行为。使用本文中提供的信息或工具所造成的任何后果和损失由使用者自行承担,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。一、简介Bazaar是一个强大的分布式版本控制系统,旨在帮助开发者记录项目的历史......
  • Task03数据类型和操作&Task04变量与函数
    Task03数据类型和操作&Task04变量与函数常用内置类型整数int浮点数float布尔值bool类型Type列表List元组Tuple集合Set字典Dictionary(dict,或映射map)复数complex函数Function模块Module常用内置常数True表示布尔真False表示布尔假None表示......
  • 洛谷P1039 [NOIP2003 提高组] 侦探推理
    ProblemSolve较为快速且好想的暴力方法是枚举m个人中选n个的组合方案,然后对证词进行检验,时间复杂度\(O(\frac{m!}{n!^2}p)\),仔细算算竟然能够在2e8左右通过但实际上这道题在当年肯定是给不了你2e8/sec的算力的,这道题目能够评蓝我觉得上面方法肯定是不配的结合€€£在18年及......
  • Y20030041 java+mysql基于微信小程序的阅读器的设计与实现 源代码 配置 文档
    基于微信小程序的阅读器1.项目描述2.目的和意义3.项目功能结构4.界面展示5.源码获取1.项目描述当计算机在人们生活的各个领域迅速曼延之时,人们获取信息的方式也更加的直接迅速,网络化使信息领域变得更为广泛,在也没有了时间和空间的限制。人们获取信息大部分是通过网......
  • Y20030035 基于微信小程序+Java+SpringBoot+vue+maven+mysql+的车位租赁管理系统设计
    车位租赁管理系统1.项目描概述2.开发的背景与意义3.功能结构4.界面展示5.源码获取1.项目描概述在移动互联网的迅速发展推进下,微信成了人们生活中不可缺少的一款信息交流和沟通平台。而微信小程序的推出,便得现在人们在日常生活中更多的是通过手机微信平台进行安装各......
  • y20030034 微信小程序+java+jsp+servlet+mysql+电子设备回收小程序 源码 配置 文档
    电子设备回收小程序1.摘要2.开发背景和意义3.功能结构4.界面展示5.源码获取1.摘要随着移动互联网的发展,微信小程序已经成为人们生活中不可或缺的一部分。微信小程序的优点在于其快速、轻量、易用,用户无需下载即可使用,节省了用户的时间和空间。随着人们对环保意识的......
  • 【Azure ADLS】为Azure Data Lake Storage的Container赋予了操作权限后创建子文件夹遇
    问题描述在ADF操作StorageAccount(AzureDataLakeStorage),在已经为根Container赋予了权限后,创建子文件夹的时候还是报错403"Thisrequestisnotauthorizedtoperformthisoperationusingthispermission"403  问题解答这是因为ADLSContainer的ACL权限有两......