这是悦乐书的第341次更新,第365篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Medium级别的第2题Longest Substring Without Repeating Characters(顺位题号是3)。给定一个字符串,找到最长无重复字符子字符串的长度。例如:

输入:“abcabcbb”
输出:3
说明:答案是“abc”,长度为3。

输入:“bbbbb”
输出:1
说明:答案是“b”,长度为1。

输入:“pwwkew”
输出:3
说明:答案是“wke”,长度为3。请注意,答案必须是子字符串,“pwke”是子序列而不是子字符串。

02 第一种解法

暴力解法,使用双指针HashSet

每次选取一个字符,从该字符开始往后遍历,存入HashSet中去,借助HashSet来判断是否重复出现,如果遇到重复字符,就结束循环,计算起始索引的长度,然后将HashSet清空,继续循环,再从第二个字符开始遍历,直到处理完所有字符。

此解法的时间复杂度是O(N^2),最坏情况下时间复杂度是O(N^3),因为HashSet的contains方法;空间复杂度是O(N)

public int lengthOfLongestSubstring(String s) {Set<Character> set = new HashSet<Character>();int n = s.length(), left = 0, right = 0;int result = 0;for (int i=0; i<n; i++) {left = i;right = i;while (right < n && !set.contains(s.charAt(right))) {set.add(s.charAt(right));right++;}result = Math.max(result, right-left);set.clear();}return result;
}

03 第二种解法

针对第一种解法,我们还可以将HashSet换成数组,用数组来判断字符是否重复出现,其他思路一样。

public int lengthOfLongestSubstring2(String s) {int[] set = new int[256];int n = s.length(), left = 0, right = 0;int result = 0;for (int i=0; i<n; i++) {left = i;right = i;while (right < n && ++set[s.charAt(right)] < 2) {right++;}result = Math.max(result, right-left);// 将数组元素值全部重置为0Arrays.fill(set, 0);}return result;
}

04 第三种解法

滑动窗口算法。

此解法和上面的第一种解法有点类似,使用两个变量,一左一右,像窗口一样滑动,遇到重复值时,就将左边的一个字符从HashSet中移除,直到遍历完所有字符。

此解法的时间复杂度是O(N),最坏情况下时间复杂度是O(N^2),因为HashSetcontains方法;空间复杂度是O(N)

public int lengthOfLongestSubstring3(String s) {Set<Character> set = new HashSet<Character>();int n = s.length(), left = 0, right = 0;int result = 0;while (left < n && right < n) {if (!set.contains(s.charAt(right))) {set.add(s.charAt(right));right++;result = Math.max(result, right-left);} else {set.remove(s.charAt(left));left++;}}return result;
}

05 第四种解法

使用索引值来判断,同时将HashSet换成256大小的数组。

public int lengthOfLongestSubstring4(String s) {int[] set = new int[256];int n = s.length(), i = 0, j = 0;int result = 0;while (i < n && j < n) {i = Math.max(set[s.charAt(j)], i);result = Math.max(result, j-i+1);set[s.charAt(j)] = j+1;j++;}return result;
}

06 小结

算法专题目前已连续日更超过六个月,算法题文章210+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,好看、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/10963348.html

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

  1. 找到字符串的最长无重复字符子串

    题目: 给定一个字符串str,返回str中最长无重复字符子串的长度. 举例: str = "abcd",返回4.  str = "aabcb",返回3. 基本思 ...

  2. 牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案

    牛客题霸 [找到字符串的最长无重复字符子串] C++题解/答案 题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 题解: i和j两个指针分别指不重复子 ...

  3. 《程序员代码面试指南》第五章 字符串问题 找到字符串的最长无重复字符子串...

    题目 找到字符串的最长无重复字符子串 java代码 努力中.... 转载于:https://www.cnblogs.com/lizhouwei/p/8955166.html

  4. 【字符串】最长无重复字符子串练习题

    **对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. ...

  5. leetcode算法—无重复字符的最长子串 Longest Substring Without Repeating Characters

    关注微信公众号:CodingTechWork,一起学习进步. 题目 Longest Substring Without Repeating Characters: Given a string, fi ...

  6. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

  7. 最长无重复字符子串?

    2019独角兽企业重金招聘Python工程师标准>>> 题目要求: 给定一个字符串S,在该字符串中找到一个最长的没有重复字符的子串. 转载于:https://my.oschina.n ...

  8. java 最长不重复子串,最长无重复字符子串

    正文在下面,先打个广告: 问题描述: 输入:abdca 返回:abdc 方法一:使用双指针(滑动窗口)来实现.该方法需要配合map保存已经出现过的字符. public static int maxLe ...

  9. (LeetCode刷题)Day03 无重复字符的最长子串

    无重复字符的最长子串 [3. Longest Substring Without Repeating Characters](https://leetcode.com/problems/longest ...

最新文章

  1. python画仿真图-仿真入门:几行 Python 代码实现复杂社会动力学
  2. 使用css3进行增强
  3. Java线程详解(11)-线程池
  4. sonarqube执行命令遇上的小问题
  5. 微服务网关Gateway实现Host过滤
  6. 深入理解ElasticSearch(六)排序与相关性
  7. java 继承类_java类的继承
  8. 16 BP报错-尚未在外部定义科目组 的编码范围
  9. python ip,Python IP处理模块IPy(转载)
  10. 第 20 次 CSP认证 202009-3 点亮数字人生
  11. 安卓 IOS 抓包工具介绍、下载及配置
  12. gstreamer插件指南
  13. C语言——逻辑运算符
  14. java计算机毕业设计公立医院绩效考核系统MyBatis+系统+LW文档+源码+调试部署
  15. 【电脑桌面不见了怎么办】
  16. 危化品企业双重预防机制数字化系统怎样建?
  17. 丁小平微积分研究成果刍议(转载)
  18. 无需修改代码,用 fcapp.run 运行你的 REST 应用
  19. C语言实训 管理系统
  20. android相机故障代码解决方法,Android相机服务器死机和相机错误 – 100

热门文章

  1. TC配置文件WCMD.INI详解,只能在ini重修改的配置
  2. SQL学习笔记-嵌套查询
  3. OpenCV3.2.0+VS2017在window10开发环境配置记录
  4. ECSHOP学习笔记
  5. 使用Nmap获取目标服务器开放的服务以及操作系统信息
  6. 巧用CSS的Wave滤镜
  7. 以下一些使用ASP.NET和VISUAL STUDIO.NET2003的经验和技巧
  8. opencv图像旋转
  9. 【Live555】live555源码详解(二):BasicHashTable、DelayQueue、HandlerSet
  10. mysql邮箱配置文件_SQL-数据库邮箱配置