文章目录

  • 题目描述
  • 思路 && 代码
    • 1. 之前的版本
    • 更新 2.0

题目描述

  • 子串:各字符间必须要相邻,而非子序列
  • 使用滑动窗口来做就行

思路 && 代码

1. 之前的版本

  • 思路:维护一个滑动窗口,滑动窗口中容纳一个无重复字符的子串。
  • 滑动窗口左边界移动的情况:
    1. 【abc】 a => a【bca】
    2. 【abcd】 c => abc【dc】
  • 其实以上两种情况殊途同归,都是把左边界换成当前判断字符在HashMap中对应的下标的位置的后一个
    然后把前面的字符全都丢弃即可(在HashMap中remove())。
  • 左边界移动的情况,需要进行长度的判断:当前滑动窗口长度可能会改变,如果比当前存储的最大长度要大,那么就需要更新。
  • 为什么可以这样子:特别记录一下,这道题其实老早就通过了。。但是之后考虑情况多了,出现了觉得自己写的代码其实考虑不周,但是就是过了的情况= =。
    主要是有这个注意点:在上面的左边界移动情况2,考虑到abc都被丢弃,但是有没有可能a、b实际上可能可以创造最长子串呢? 答案是没有,因为实际上最多的长度【abcd】已经被记录下来了,b最多就是【bcd】c的情况,a也同理,因此已经可以直接丢弃掉了。
class Solution {public int lengthOfLongestSubstring(String s) {int len=0, lenNow=0;HashMap<Character,Integer> hashMap = new HashMap<>();for(int i=0;i<s.length();i++){if(hashMap.containsKey(s.charAt(i))){// 和left.char相同的情况下,可以继续// 这个if是个优化,但是其实删掉也可以,之后的代码对于这种情况达到一样的效果if(hashMap.get(s.charAt(i))==i-lenNow){hashMap.put(s.charAt(i),i);continue;}// 否则需要把前面的全删了len = Math.max(len,lenNow);// 获取当前重复值的下标。int temp = hashMap.get(s.charAt(i));// 维护哈希表:把不需要的映射remove掉。for(int j = i-lenNow;j<=temp;j++){hashMap.remove(s.charAt(j),j);}// 更新当前滑动窗口的长度lenNow = i - temp;hashMap.put(s.charAt(i),i);}else{hashMap.put(s.charAt(i),i);lenNow++;}}// 一直数到字符串结束的情况,补一个补充return Math.max(len,lenNow);}
}
  • 时间复杂度:O(N),实际上整个流程本质上就是对字符串的每一个元素都必然访问一次可能删除一次
  • 空间复杂度:O(字符集的大小),因为我们需要简历哈希表,而表最大的情况下会容纳整个字符集(及对应下标)。

更新 2.0

  • 比较精简的代码
class Solution {public int lengthOfLongestSubstring(String s) {// initint len = s.length();int max = 0;char[] arr = s.toCharArray();// <字符,字符出现下标>Map<Character, Integer> hashmap = new HashMap<>();int windowLeft = 0;for(int i = 0; i < len; i++) {// Case 1 重复if(hashmap.containsKey(arr[i])) {int index = hashmap.get(arr[i]);for(int j = windowLeft; j <= index; j++) {hashmap.remove(arr[j]);}windowLeft = index + 1;hashmap.put(arr[i], i);}// Case 2 没重复else {hashmap.put(arr[i], i);max = Math.max(max, hashmap.size());}}return max;}
}

【LeetCode笔记】3. 无重复字符的最长子串(JAVA、滑动窗口、字符串)相关推荐

  1. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  2. LeetCode 3. 无重复字符的最长子串(滑动窗口+哈希)

    1. 题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...

  3. 无重复字符的最长子串_滑动窗口

    思路: 这道题主要用到思路是:滑动窗口. 其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求.所以,我 ...

  4. 10.无重复字符的最长子串---使用滑动窗口方法和哈希表来解决

    一.解题方法:滑动窗口 1.本题可以使用双层for循环暴力破解,但是时间复杂度很高,会达到O(n^2),所以采用滑动窗口的方法来降低时间复杂度. 2.定义一个HashMap数据集合,其中key值为字符 ...

  5. 刻意练习:LeetCode实战 -- Task16. 无重复字符的最长子串

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

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

    3. 无重复字符的最长子串 Ideas 这题有点KMP那味了. 首先定义三个变量: left:-1,当前处理字符串长度的左索引的前一位 res:0,最长子串长度 idx:{},最长子串中每个字符出现的 ...

  7. [剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]

    [问题描述][第3题][无重复字符的最长字串] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重 ...

  8. LeetCode 3.无重复字符的最长字串(滑动窗口)

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a ...

  9. 【Leetcode 3】无重复字符的最长子串

    题目描述 2020年8月25日更新 一次遍历 思路: (1)一次遍历,用list存放遍历的连续不重复的子串,当遍历到重复的字符时,用index()方法获得list当中重复字符a的索引,然后将list重 ...

  10. leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)

    给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k .返回这一子串的长度. 示例 1: 输入:s = "aaabb", ...

最新文章

  1. pxe安装linux后命令不可用,CentOS7下的PXE无人值守系统安装(亲测成功)
  2. android文件存储token,ANDROID 学习笔记(二) 用户登陆问题 TOKEN SESSION 缓存
  3. 联想android刷机教程视频,联想s939刷机教程(刷官方系统)
  4. 无监督和有监督的区别_干货|全面理解无监督学习基础知识
  5. ios 多线程 -- NSOperation 常用方法
  6. The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
  7. U盘病毒及其相关资源的分析(patch shell32.dll)
  8. HNUSTOJ-1437 无题
  9. windows7怎么清空电脑只剩系统
  10. springboot 手动提交事务_面试官你都工作3年了,也做过5个项目了,怎么连事务机制都不会...
  11. Hexo 搭建个人博客指南
  12. linux匹配数字正则,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  13. 在Word中如何进行半行输入
  14. 浅谈MySQL存储引擎
  15. 华为机试题输入输出总结
  16. 编程实现对率回归,并给出西瓜数据集 3.0α 上的结果.
  17. 程炳皓:关于技术领导力,十个耸人听闻的观点
  18. JetpackCompose快速实现底部导航栏,BottomNavigation使用
  19. 据说大多数程序员都钟爱键盘,尤其是 FILCO
  20. Latex如何写参考文献及修改顺序

热门文章

  1. itext html 转换 pdf文件,利用itext实现html转pdf文档
  2. 微信小程序js数组初始化_微信小程序学习Course 3-2 JS数组对象学习
  3. dbref java_查询mongodb dbref内部字段
  4. python 首次登陆outlook 脚本_记Python“用户环境”的一次完美应用
  5. FCOS: A Simple and Strong Anchor-free Object Detector
  6. pytorch数据预处理
  7. 微服务架构设计模式~识别系统操作
  8. java+long是什么_Java中long的模运算符是什么? - java
  9. C++学习之路 | PTA乙级—— 1059 C语言竞赛 (20 分)(精简)
  10. Win32窗体应用程序如何添加资源文件?