当前位置: 首页 > news >正文

算法练习03——滑动窗口

目录

  • 3. 无重复字符的最长子串*
  • 438. 找到字符串中所有字母异位词*
  • 30. 串联所有单词的子串***(hard)

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

https://leetcode.cn/problems/longest-substring-without-repeating-characters/

class Solution {public int lengthOfLongestSubstring(String s) {//哈希表+滑动窗口int res=0;int left=-1;Map<Character,Integer> hash=new HashMap<>();for(int right=0;right<s.length();right++){if(hash.containsKey(s.charAt(right))){left=Math.max(left,hash.get(s.charAt(right)));}hash.put(s.charAt(right),right);res=Math.max(res,right-left);}return res;}
}

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

https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&envId=top-100-liked

class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> res=new ArrayList<>();int sLen=s.length();int pLen=p.length();if(sLen<pLen){return res;}//建立两个数组存放字符串中字母出现的词频,并以此作为标准比较int [] scount=new int[26];int [] pcount=new int[26];//当滑动窗口的首位在s[0]处时 (相当于放置滑动窗口进入数组)for(int i=0;i<pLen;i++){++scount[s.charAt(i)-'a']; //记录s中前pLen个字母的词频++pcount[p.charAt(i)-'a']; //记录要寻找的字符串中每个字母的词频(只用进行一次来确定)}//判断放置处是否有异位词  (在放置时只需判断一次)if(Arrays.equals(scount,pcount)){res.add(0);}   //开始让窗口进行滑动for(int i=0;i<sLen-pLen;i++){ //i是滑动前的首位--scount[s.charAt(i) -'a'];       //将滑动前首位的词频删去++scount[s.charAt(i+pLen) -'a'];  //增加滑动后最后一位的词频(以此达到滑动的效果)//判断滑动后处,是否有异位词if(Arrays.equals(scount,pcount)){res.add(i+1);} }return res;}
}

30. 串联所有单词的子串***(hard)

https://leetcode.cn/problems/substring-with-concatenation-of-all-words/

class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> res = new ArrayList<>();// 所有单词的个数int num = words.length;// 每个单词的长度(是相同的)int wordLen = words[0].length();// 字符串长度int stringLen = s.length();for (int i = 0; i < wordLen; i++) {// 遍历的长度超过了整个字符串的长度,退出循环if (i + num * wordLen > stringLen) {break;}// differ表示窗口中的单词频次和words中的单词频次之差Map<String, Integer> differ = new HashMap<>();// 初始化窗口,窗口长度为num * wordLen,依次计算窗口里每个切分的单词的频次for (int j = 0; j < num; j++) {String word = s.substring(i + j * wordLen, i + (j + 1) * wordLen);differ.put(word, differ.getOrDefault(word, 0) + 1);}// 遍历words中的word,对窗口里每个单词计算差值for (String word : words) {differ.put(word, differ.getOrDefault(word, 0) - 1);// 差值为0时,移除掉这个wordif (differ.get(word) == 0) {differ.remove(word);}}// 开始滑动窗口for (int start = i; start < stringLen - num * wordLen + 1; start += wordLen) {if (start != i) {// 右边的单词滑进来String word = s.substring(start + (num - 1) * wordLen, start + num * wordLen);differ.put(word, differ.getOrDefault(word, 0) + 1);if (differ.get(word) == 0) {differ.remove(word);}// 左边的单词滑出去word = s.substring(start - wordLen, start);differ.put(word, differ.getOrDefault(word, 0) - 1);if (differ.get(word) == 0) {differ.remove(word);}word = s.substring(start - wordLen, start);}// 窗口匹配的单词数等于words中对应的单词数if (differ.isEmpty()) {res.add(start);}}}return res;}
}

相关文章:

  • 氢气泄漏检测仪使用方法:守护安全,从细节开始
  • C++ 之LeetCode刷题记录(二十七)
  • 微服务框架go-zero集成swagger在线接口文档
  • 科普类(遥操作)——快速索引
  • 比瓴科技入围软件供应链安全赛道!为关键信息基础设施安全建设注入新动力
  • 银行数据仓库体系实践(8)--主数据模型设计
  • 如何手机搜智慧职教答案?3个受欢迎的搜题分享了 #微信#学习方法#笔记
  • 深度学习入门笔记(七)卷积神经网络CNN
  • FreeRTOS任务挂起以及延时部分源码分析
  • 计算机网络第4章(网络层)
  • 【数据结构】单向链表实现 超详细
  • DAO设计模式
  • Vue打包Webpack源码及物理路径泄漏问题解决
  • 【vue】报错 Duplicate keys detected 解决方案
  • 简单说说redis分布式锁
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Computed property XXX was assigned to but it has no setter
  • ES6 学习笔记(一)let,const和解构赋值
  • github从入门到放弃(1)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java小白进阶笔记(3)-初级面向对象
  • js操作时间(持续更新)
  • Linux下的乱码问题
  • Python学习之路16-使用API
  • Vue.js源码(2):初探List Rendering
  • Vultr 教程目录
  • win10下安装mysql5.7
  • Xmanager 远程桌面 CentOS 7
  • 从伪并行的 Python 多线程说起
  • 浮现式设计
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 基于webpack 的 vue 多页架构
  • 免费小说阅读小程序
  • 数组的操作
  • 我与Jetbrains的这些年
  • 说说我为什么看好Spring Cloud Alibaba
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #100天计划# 2013年9月29日
  • #android不同版本废弃api,新api。
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (C)一些题4
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (学习日记)2024.01.09
  • (译)2019年前端性能优化清单 — 下篇
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .net6Api后台+uniapp导出Excel
  • .NET企业级应用架构设计系列之开场白
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [145] 二叉树的后序遍历 js
  • [AIGC] Java 和 Kotlin 的区别
  • [AIGC] 如何建立和优化你的工作流?