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

滑动窗口-3.无重复字符的最长子串-力扣(LeetCode)

一、题目解析

1.子串VS子数组

它们都是连续的一段,子串是字符串中连续的一段,子数组是数组中连续的一段。

2.字符串s由英文字母、数字、符号和空格组成 

二、算法解析

解法1:暴力枚举+哈希表(判断字符是否出现) 时间复杂度为O(N^2)

固定一个开头,枚举出所有可能子串

解法2:滑动窗口+哈希表 时间复杂度为O(N) 

why?为什么是滑动窗口?

最开始,left和right固定为同一起点处d,right向右移动,当遇到相同元素时,right指针可以停在原地,是因为若和上面left和right固定在e处一样,结果与下图相同,right始终会停留在相同的位置,left没有越过重复的元素a,所以right不会移动;根据后面图的规律,我们能推断出left和right都是向右移动的,而left和right之间的距离就像窗口一样,把内容给框了出来,这就是就是使用滑动窗口的原因。

how?滑动窗口的具体步骤?

1.定义双指针left,right
2.进窗口->让字符进入哈希表中
3.判断->当窗口内出现重复字符时,需要进行处理
        出窗口->从哈希表中删除该字符
这里的判断和出窗口是循环操作
4.更新结果
更新结果的位置可以出现在任意位置,根据题目要求来确认,更新结果位置,该题更新结果位置在判断结束之后更新结果。

 这里需要注意的why而不是how,当你足够熟悉时,滑动窗口代码编写不是难事,但是我们需要学习的思想,知道为什么能使用滑动窗口,不然遇到新的一道题也会找不到门路解决

三、代码示例

解法2:

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

这里没有使用unordered_map和unordered_set,反而使用hash数组通过下标映射来处理字符进入哈希表和删除操作

看到最后,如果对您有所帮助,还请点赞、关注和收藏,我们下期再见!

http://www.xdnf.cn/news/1101169.html

相关文章:

  • 使用Python和AkShare轻松获取新闻联播文字稿:从数据获取到文本挖掘
  • vue3+ts div自由拖拽改变元素宽度
  • C++——构造函数的补充:初始化列表
  • UML 与 SysML 图表对比全解析:软件工程 vs 系统工程建模语言
  • ContextMenu的Item如何绑定命令
  • “28项评测23项SOTA——GLM-4.1V-9B-Thinking本地部署教程:10B级视觉语言模型的性能天花板!
  • 【AI大模型】BERT微调文本分类任务实战
  • 拼数(字符串排序)
  • 力扣面试150(29/100)
  • 问题 C: 为美好的世界献上爆炎(博弈论)
  • 如何在 Windows 10 上安装设置 Apache Kafka
  • 聊聊AI大模型的上下文工程(Context Engineering)
  • 你见过的最差的程序员是怎样的?
  • Redis底层数据结构
  • CSS3的核心功能介绍及实战使用示例
  • 提示工程:解锁大模型潜力的核心密码
  • 库存订单管理系统:3月份开源项目汇总
  • linux中cmake编译项目
  • Django母婴商城项目实践(二)
  • 1.1.2 运算符与表达式——AI教你学Django
  • 3.检查函数 if (!CheckStart()) return 的妙用 C#例子
  • Vue3 Pinia
  • php中调用对象的方法可以使用array($object, ‘methodName‘)?
  • DSPy:用编程思维驯服大模型的新范式
  • 2025年主流数据库连接池推荐:从原理到场景的深度解析
  • Java 大视界 -- Java 大数据在智能医疗远程手术机器人操作数据记录与分析中的应用(342)
  • 传输层协议UDP原理
  • 二分查找1
  • JavaScript加强篇——第五章 DOM节点(加强)与BOM
  • 企业培训笔记:Vue3前端框架配置