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

【算法专题】滑动窗口—无重复字符的最长子串

力扣题目链接:无重复字符的最长子串

一、题目解析

二、算法原理

解法一:暴力解法(时间复杂度最坏:O(N))

从每一个位置开始往后枚举,在往后寻找无重复最长子串时,可以利用哈希表来统计字符出现的频率,如果出现了重复字符就跳出循环,如果没有重复则更新结果,这样枚举下去找到长度最长的返回即可。

解法二:滑动窗口

 滑动窗口也是定义了两个指针在移动,但是这两个指针所指向的区间就像一个滑动的窗口一样。

滑动窗口的基本步骤

  • 定义两个指针int left=0,right=0;
  • 进入滑动窗口——>让字符进入哈希表
  • 判断条件——>窗口内出现重复字符
  • 出滑动窗口——>从哈希表中将字符删除
  • 更新结果

:结果的更新不一定是放在最后,这个要根据题目的要求进行相应的改变,而且判断条件是要循环一直判断,如果满足就出窗口,不满足条件循环才停止。

 

 每次移动指针的时候结果都在更新,所以结果不会出错。

时间复杂度:虽然代码是两层循环,但是left指针和right指针都是不回退的,两者最多都往后移动n次。因此时间复杂度是O(N)。

这个题最大的难度是怎么分析这个问题从而想到要用滑动窗口来解决。 

三、代码编写

暴力枚举

class Solution {
public:int lengthOfLongestSubstring(string s) {int ret = 0;int n = s.size();for(int i = 0; i < n; i++){int hash[128] = {0};//用数组模拟哈希表,统计次数for(int j = i; j < n; j++){hash[s[j]]++;if(hash[s[j]] > 1)//判断是否重复break;ret = max(ret, j - i + 1);//更新结果}}return ret;}
};

滑动窗口 

class Solution {
public:int lengthOfLongestSubstring(string s) {int ret = 0;int left = 0, right = 0, n = s.size();int hash[128] = {0};//用数组来模拟哈希表while(right < n){hash[s[right]]++;//进窗口while(hash[s[right]] > 1)//判断{hash[s[left++]]--;//出窗口}ret = max(ret, right - left + 1);//更新结果right++;}return ret;}
};

如有错误或不足欢迎大家批评指正。

相关文章:

  • Django项目window环境部署
  • Python之Pygame游戏编程详解
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十一)
  • Missing file libarclite_iphoneos.a 问题解决方案
  • Halcon Solution Guide I basics(4): Blob Analysis(连通性解析)
  • 【Java】认识异常
  • 数据提取PDF SDK的对比推荐
  • Photoshop下载秘籍:附送7款不用下载的在线PS工具!
  • 12.docker的网络-host模式
  • ModuleNotFoundError: No module named ‘torch_sparse‘
  • 浅谈Linux bash脚本----getopts获取脚本POSIX标准传参
  • 弹窗msvcp140_1.dll丢失的解决方法,超简单的方法分享
  • TrustAsia亮相Matter开发者大会,荣获Matter优秀赋能者奖
  • 【Spring进阶系列丨第四篇】学习Spring中的Bean管理(基于xml配置)
  • Vue 2使用element ui 表格不显示
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angularjs之国际化
  • CSS 三角实现
  • es6(二):字符串的扩展
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java 多线程基础, 我觉得还是有必要看看的
  • Java小白进阶笔记(3)-初级面向对象
  • Linux后台研发超实用命令总结
  • Mocha测试初探
  • MySQL QA
  • NSTimer学习笔记
  • Twitter赢在开放,三年创造奇迹
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 排序(1):冒泡排序
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 我从编程教室毕业
  • 携程小程序初体验
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 再谈express与koa的对比
  • 追踪解析 FutureTask 源码
  • scrapy中间件源码分析及常用中间件大全
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #java学习笔记(面向对象)----(未完结)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (07)Hive——窗口函数详解
  • (1)(1.11) SiK Radio v2(一)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (二)JAVA使用POI操作excel
  • (附源码)ssm高校实验室 毕业设计 800008
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)mysql_MYSQL(三)
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (一)SvelteKit教程:hello world