题目描述

2020年8月25日更新

一次遍历

思路:
(1)一次遍历,用list存放遍历的连续不重复的子串,当遍历到重复的字符时,用index()方法获得list当中重复字符a的索引,然后将list重置赋值为[list.index(a)+1:],再把重复的字符,加到该list的最后面
(2)每次遍历一个字符,不管是否遍历到重复的字符,就判断当前list的长度和当前最长子串长度,超过当前最长子串,则用max进行替换

def test(s):# 使用一个辅助变量来暂时存储匹配的子串ans = ''tep = ''for i in s:# 遍历,若不重复则记录该字符if i not in tep:tep += i# 如果遇到了已经存在的字符,则找到该字符所在位置,删除该字符,并保留该位置之后的子串,并把当前字符加入到最后,完成更新else:tep = tep[tep.index(i) + 1:]tep += i# 如果是当前最长的,就替换掉之前存储的最长子串if len(tep) > len(ans):ans = tepreturn len(ans)

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/si-lu-qing-xi-yi-ci-bian-li-gao-xiao-qiu-jie-by-jo/

2020年8月更新

python版本

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 哈希集合,记录每个字符是否出现过occ = set()n = len(s)# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动rk, ans = -1, 0for i in range(n):if i != 0:# 左指针向右移动一格,移除一个字符occ.remove(s[i - 1])while rk + 1 < n and s[rk + 1] not in occ:# 不断地移动右指针occ.add(s[rk + 1])rk += 1# 第 i 到 rk 个字符是一个极长的无重复字符子串ans = max(ans, rk - i + 1)return ans

Java版本

class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合,记录每个字符是否出现过Set<Character> occ = new HashSet<Character>();int n = s.length();// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动int rk = -1, ans = 0;for (int i = 0; i < n; ++i) {if (i != 0) {// 左指针向右移动一格,移除一个字符occ.remove(s.charAt(i - 1));}while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {// 不断地移动右指针occ.add(s.charAt(rk + 1));++rk;}// 第 i 到 rk 个字符是一个极长的无重复字符子串ans = Math.max(ans, rk - i + 1);}return ans;}
}

方法一:暴力法,会超时,java版本

public class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();int ans = 0;for (int i = 0; i < n; i++)for (int j = i + 1; j <= n; j++)if (allUnique(s, i, j)) ans = Math.max(ans, j - i);return ans;}public boolean allUnique(String s, int start, int end) {Set<Character> set = new HashSet<>();   //hashset是不含重复值的无序集合(列表)for (int i = start; i < end; i++) {Character ch = s.charAt(i);   //charAt方法会返回字符串中所在索引的位置if (set.contains(ch)) return false;set.add(ch);}return true;}
}

hashset当中添加重复元素,会自动去重

方法二:java版本

简单说明就是目前遍历到abc ,后面遍历到abca ,删除前面一个a ,变成bca

public class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();Set<Character> set = new HashSet<>();int ans = 0, i = 0, j = 0;while (i < n && j < n) {// try to extend the range [i, j]if (!set.contains(s.charAt(j))){set.add(s.charAt(j++));    ans = Math.max(ans, j - i);}else {set.remove(s.charAt(i++));}}return ans;}
}

方法三: 优化的滑动窗口 ,java 版本,使用hashmap


public class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length(), ans = 0;Map<Character, Integer> map = new HashMap<>(); // current index of character// try to extend the range [i, j]for (int j = 0, i = 0; j < n; j++) {if (map.containsKey(s.charAt(j))) {i = Math.max(map.get(s.charAt(j)), i);}ans = Math.max(ans, j - i + 1);map.put(s.charAt(j), j + 1);}return ans;}
}

方法四:

public class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length(), ans = 0;int[] index = new int[128]; // 创建整型数组,数组不赋值,默认全为0// try to extend the range [i, j]for (int j = 0, i = 0; j < n; j++) {    //该程序只有j++,i只有遇到重复元素,才会被重新赋值i = Math.max(index[s.charAt(j)], i);   //数组元素的索引如果不存在对应的数组元素的值,默认为0,该句和方法三中的if判断同理  if (map.containsKey(s.charAt(j))) ans = Math.max(ans, j - i + 1);index[s.charAt(j)] = j + 1;}return ans;}
}

参考链接
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetcod/

对比leetcode 1044题,最长重复子串

【Leetcode 3】无重复字符的最长子串相关推荐

  1. [贪心|字符串] leetcode 3 无重复字符的最长子串

    [贪心|字符串] leetcode 3 无重复字符的最长子串 1.题目 题目链接 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例1: 输入: "abcabcbb" ...

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

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

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

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

  4. [leetcode] 3.无重复字符的最长子串

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

  5. LeetCode 3:无重复字符的最长子串 思考分析

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

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

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

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

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

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

    3. 无重复字符的最长子串 题意: 找子串 子串中无重复字符 要求子串长度最长 解法1(暴力法) 思路: 建立一个长度不断变小的滑动窗口 用一个指针指针扫描窗口内的每个元素: 如果除去指针指向的那个元 ...

  9. leetcode -- 3.无重复字符的最长子串

    内容描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. class Solution(object):def lengthOfLongestSubstring(self, s):& ...

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

    题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

最新文章

  1. golang 切片的三种简单使用方式及区别
  2. 删除word菜单栏上的adobe comments的终极办法
  3. opengl编程从入门到精通-hello,window
  4. 工作组模式下专用队列(Private Queue)如何引用远程队列路径
  5. 为什么 c = tf.matmul(a, b) 不立即执行矩阵乘法?
  6. 为什么大学要学一堆纸上谈兵的课程?(转)
  7. Spring Boot系列教程八: Mybatis使用分页插件PageHelper
  8. 技术解读丨分布式缓存数据库Redis大KEY问题定位及优化建议
  9. 不分享“年度报告”的人,多少有点难言之隐
  10. skynet源码分析5:lua绑定之地基
  11. 最全的Vim操作快捷键
  12. 数据库设计原则、表字段命名规则、索引调优建立规则
  13. aria2 配置教程
  14. 基于阿里钉钉网页版制作绿色版客户端
  15. TZT3801G无线振弦在线监测系统
  16. Apache Shiro 全面源码解析汇总
  17. pop链 php,POP链
  18. 基于winform的GIS离线地图
  19. Pure-ftpd 安装笔记
  20. Linux系统中 chown和chmod 命令的区别:

热门文章

  1. 计算机工作理想湿度,计算机理想的工作温度七月的盛夏,碧空中没有一丝云彩,只剩下纯(11)...
  2. 如何从零开始搭建自己的博客(通俗易懂)
  3. html 获取语音时长,javascript – HTML5音频 – 获取声音对象的时间(howler.js)
  4. 2019年计算机网络管理员大赛,【重磅】信息工程学院代表队入围2019年中国高校计算机大赛网络技术挑战赛晋级赛...
  5. 鸿蒙os和hms,华为的鸿蒙os和HMS可以改变,当前美国独霸世纪操作系统的格局?...
  6. 未来偶像的硬件破局:为爱买单,不为 AI 买单
  7. MP2451DJ-LF-Z规格参数介绍
  8. 如何建设网上订货商城系统 订货系统建设流程分享
  9. 华为设计总监:如何做设计决策
  10. Windows安装mysql,亲测有效