LeetCode 3:Longest Substring Without Repeating Charact

Given a string s, find the length of the longest substring without repeating characters.

说人话:

在一个字符串中寻找没有重复字母的最长子串。

举例1:

举例2:

举例3:

举例4:

[法1] 滑动窗口

思路

滑动窗口的思想是我们取 2 个索引 ij ,这样就围成了一个窗口,窗口 s[i…j] 是没有重复字母的。

① 然后我们不断向右边扩展,直至字符串结束或者是遇到重复字符了。那么这个时候我们就暂时找到了一个符合条件的子串的,记下当前的子串长度。

② 然后我们从左边删除字符,直至字符串不包含即将从右边加入的字符的时候就停下。

这样我们就又可以执行 ① 来扩展子串了,这个循环 ① ② 直至结束。

算法
class Solution {public int lengthOfLongestSubstring(String s) {int result = 0;//子串为 s[left...right]int left = 0;int right = -1;while(left < s.length()){//不断往后边加入满足条件的字符while(right+1 < s.length() &&!s.substring(left,right+1).contains(s.substring(right+1,right+2))){ right++;}//跳出循环,记录当前最长的子串长度result = (result > (right-left+1))?result:(right-left+1);//右边已经到底了,那就说明已经找到最长的了if(right == s.length()-1){break;}//不能往后边加的时候,从左边删,删到可以往后边加为止while(left < s.length() &&s.substring(left,right+1).contains(s.substring(right+1,right+2))){left++;}}return result;}
}
提交结果

代码分析
  • 时间复杂度:O(n):实际上我们的 left 和 right 只是遍历了一遍字符串,所以时间复杂度只是 O(n)
  • 空间复杂度:O(1)
改进思路

为什么 O(n) 的时间复杂度在 Leetcode 提交后执行用时这么久呢?其实是因为我们在判断字符串中是否存在某字符的时候用了 JDK 的 API:s.contains(substring)。这个 API 在判断的时候每次都会遍历我们整个字符串,这是比较耗时的,也是我们可以改进的地方。

[法2] 优化判断是否重复的逻辑

思路

ASCII 总共就 256 个,我们可以创建一个临时数组来记录字符串中的字符在 ASCII 中出现的频率,以此来判断是否存在重复字符。

代码
class Solution {public int lengthOfLongestSubstring(String s) {//记录字符出现频率int[] freq = new int[256];int result = 0;//子串为 s[left...right]int left = 0;int right = -1;while(left < s.length()){//不断往后边加入满足条件的字符while(right+1 < s.length() && freq[s.charAt(right+1)] == 0){right++;freq[s.charAt(right)] ++;}//跳出循环,记录当前最长的子串长度result = (result > (right-left+1))?result:(right-left+1);//右边已经到底了,那就说明已经找到最长的了if(right == s.length()-1){break;}//不能往后边加的时候,从左边删,删到可以往后边加为止while(left < s.length() && freq[s.charAt(right+1)] > 0){freq[s.charAt(left)] --;left++;}}return result;}
}
提交结果

代码分析
  • 时间复杂度:O(n),优化后我们的时间复杂度还是一样的,但是省去了底层遍历字符串,大大减少了执行同时。
  • 空间复杂度:用了存储字符使用频率的临时数组,O(256) = O(1)

LeetCode 3:Longest Substring Without Repeating Charact相关推荐

  1. Leetcode 3:Longest Substring Without Repeating Characters(最长不重复子串)

    Description Given a string, find the length of the longest substring without repeating characters. 给 ...

  2. LeetCode算法入门- Longest Substring Without Repeating Characters-day4

    LeetCode算法入门- Longest Substring Without Repeating Characters-day4 Longest Substring Without Repeatin ...

  3. 【LeetCode】3. Longest Substring Without Repeating Characters

    题目: Given a string, find the length of the longest substring without repeating characters. Examples: ...

  4. LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路

    笔者在完成LeetCode第三题(Longest Substring Without Repeating Characters)时,经历了设计.实现.优化三个阶段,于是通过这个三部曲系列,将当初的整个 ...

  5. LeetCode.3-最长无重复字符子串(Longest Substring Without Repeating Characters)

    这是悦乐书的第341次更新,第365篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第2题Longest Substring Without Repeating Cha ...

  6. [LeetCode]3.Longest Substring Without Repeating Characters

    [题目] Given a string, find the length of the longest substring without repeating characters. For exam ...

  7. LeetCode:3. Longest Substring Without Repeating Characters

    https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ 内容描述: Give ...

  8. LeetCode 第 3 题(Longest Substring Without Repeating Characters)

    LeetCode 第 3 题(Longest Substring Without Repeating Characters) Given a string, find the length of th ...

  9. leetcode(三)—— Longest Substring Without Repeating Characters(最长不重复子串 Python/C++)

    Longest Substring Without Repeating Characters | LeetCode OJ 使用 hash 判重问题首先想到的就是 hash(或者使用 map): 思路: ...

  10. 【贪心】LeetCode 3. Longest Substring Without Repeating Characters

    LeetCode 3. Longest Substring Without Repeating Characters Solution1:我的答案 该方法中哈希表记录的是字符出现的次数.标准的贪心算法 ...

最新文章

  1. Electron 开发环境下总是 crash
  2. qlabel文本改变信号_周明:NLP进步将如何改变搜索体验
  3. 使用Leopard Jdbc
  4. nginx 优化(突破十万并发)
  5. 2021浙江高考成绩排名查询,2021年浙江高考成绩排名查询,第一批分数线23日公布...
  6. php原生判断,JavaScript
  7. 【web前端期末大作业】html在线网上书店 基于html制作我的书屋(23页面)
  8. coreseek mysql.sock_coreseek配置
  9. 自制Linux开发板,换个核心再来一次
  10. 保利威视视频云平台 新版本(Version 1.1.0) 上线通知
  11. 毕业设计论文 基于遥感影像的道路材质信息提取方法研究
  12. vue+tsx+slot
  13. 修改linux系统iqn,linux iscsi initiator 安装配置
  14. C语言程序设计博客作业06
  15. 全球20家最具创新力的创业公司
  16. JQuary学习之路---初始JQuary
  17. 评价最高影片JAVAlibrary_视频 | 手游大神,动画导演,机圈新贵,极客怎么评价愤怒的小鸟2?...
  18. SpringBoot JAVA 动态设置定时任务执行时间
  19. 联想ThinkPad开机进不了系统的解决方式
  20. B类职称论文发表一般是什么价格

热门文章

  1. eclipse 64位 免安装_超详细:64位Linux下安装PS模拟器ePSxe
  2. 信息系统规划方法-战略目标集转化法(SST)
  3. Todd Lammle's CCNA IOS Commands Survival Guide
  4. gym 101908C Pizza Cutter (逆序对)
  5. 2022年:企业绩效管理蓝图
  6. R语言---Seewave包和tuneR在声音分析中的应用①关于声音及简单分析
  7. rabbit 消息丢失
  8. JVM -- JVM内存结构:程序计数器、虚拟机栈、本地方法栈、堆、方法区(二)
  9. 快速接入百度大脑身份证识别
  10. 二维码图片生成(带文字显示)