力扣 无重复字符的最长子串

embedded/2025/2/9 4:16:14/

滑动窗口,双指针移动找集合类的元素。

题目

无重复,可想到hashset集,然后由题找最长子串,说明要处理左右边界,可以用双指针,右指针一直遍历,左指针看到重复就加一,这像是一个滑动窗口。

java">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.remove(ss[left]);//删除ch前面的元素left++;}set.add(ss[right]);//加入当前元素res = Math.max(res, right - left + 1);//当前不重复子串的长度}return res;}
}

但用while移除set的字符的循环显然是很影响效率的,因此改用map去记下每个字符的索引,直接进行跳转。虽然时间复杂度和空间复杂度一样,但会快一点。

时间复杂度O(n),空间复杂度O(n)。

java">class Solution {public int lengthOfLongestSubstring(String s) {HashMap<Character, Integer> map = new HashMap<>();int max = 0, start = 0;for (int end = 0; end < s.length(); end++) {char ch = s.charAt(end);//右边界循环遍历每个字符if (map.containsKey(ch)){//若被判断的字符上一次出现的位置就在滑动窗口内则需要改变左边界,进行+1。start = Math.max(map.get(ch)+1,start);}max = Math.max(max,end - start + 1);//找到最长子串//更新 s.charAt 的位置map.put(ch,end);}return max;}}

还可以对空间复杂度进行优化,用双指针遍历,即不用存了,可以把空间复杂度到O(1)。双循环显然增加了时间复杂度,但时间复杂度O(N*∣Σ∣)。不重复子串区间长度不会超过字符集的长度∣Σ∣=128,当N足够大时,时间复杂度接近O(N)。使用set时cpu占用少,时间复杂度快一些,但显著提高了I/Os。不使用set,既减少了空间占用,又减少了I/Os,提高了运行速度。运行过后发现不用set更快。

java">class Solution {public int lengthOfLongestSubstring(String s) {int left = 0, length = 0, max = 0;for(int right=0; right < s.length(); right++){for(int k = left; k < right; k++){if(s.charAt(k) == s.charAt(right)){left = k+1;length = right-left;break;}}length++;if(max < length) max = length;}return max;}
}

以上均为优质题解的筛选,可多学一些思路。

滑动窗口要注意左右指针的遍历,然后结合常用集合类去存,在做算法题时要注意复杂度的优化。


http://www.ppmy.cn/embedded/160709.html

相关文章

【算法专场】分治(下)

目录 前言 归并排序 思想 912. 排序数组 算法思路 算法代码 LCR 170. 交易逆序对的总数 算法思路 算法代码 315. 计算右侧小于当前元素的个数 - 力扣&#xff08;LeetCode&#xff09; 算法思路 算法代码 493. 翻转对 算法思路 算法代码 好久不见~时隔多日&…

限流策略实战指南:从算法选择到阈值设置,打造高可用系统

前言 本文将深入探讨常见的限流算法及其适用场景&#xff0c;并详细解析基于 QPS 的限流方案。从如何设置合理的限流阈值&#xff0c;到请求被限流后的处理策略。 常见的限流算法 漏桶 核心原理 请求以任意速率进桶&#xff0c;以 恒定速率 出桶。若桶满则丢弃或排队等待适…

【3分钟极速部署】在本地快速部署deepseek

第一步&#xff0c;找到网站&#xff0c;下载&#xff1a; 首先找到Ollama &#xff0c; 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 &#xff0c;文件不是很大&#xff0c;下载也比较的快 第二部就是安装了 &#xff1a; 安装完成后提示…

将Deepseek接入pycharm 进行AI编程

目录 专栏导读1、进入Deepseek开放平台创建 API key 2、调用 API代码 3、成功4、补充说明多轮对话 总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——…

RabbitMQ的安装

1、官网地址 下载地址&#xff1a;Installing RabbitMQ | RabbitMQhttp://www.rabbitmq.com/download.htmlhttp://www.rabbitmq.com/download.html RabbitMQ Documentation | RabbitMQhttps://www.rabbitmq.com/docshttps://www.rabbitmq.com/docs 2、Windows上安装 2.1 安装…

《机器学习数学基础》补充资料:矩阵基本子空间

秩-零化度定理是线性代数中第一个基本定理&#xff0c;本文介绍的“矩阵基本子空间”&#xff0c;是第二定理。 定理2&#xff1a;矩阵基本子空间 对于 m n m\times n mn 的矩阵 A \pmb{A} A &#xff08;仅讨论实数矩阵&#xff09;&#xff0c;用线性变换表示 A : R n …

【搜索文章】:搜索(es)+ 搜索记录(mongodb)+ 搜索联想词

需求 用户输入关键字时&#xff0c;可以检索出结果&#xff0c; 并且可以查看历史搜索情况&#xff0c; 还可以进行联想词展示。 ElasticSearch&#xff08;搜索&#xff09; 准备工作 使用docker安装es&#xff0c;配置ik分词器重新建一个search模块&#xff0c;用来写搜…

利用deepseek参与软件测试 基本架构如何 又该在什么环节接入deepseek

利用DeepSeek参与软件测试&#xff0c;可以考虑以下基本架构和接入环节&#xff1a; ### 基本架构 - **数据层** - **测试数据存储**&#xff1a;用于存放各种测试数据&#xff0c;包括正常输入数据、边界值数据、异常数据等&#xff0c;这些数据可以作为DeepSeek的输入&…