【题目描述】

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解答

  • 解法:滑动窗口法

    利用set中没有重复元素来求解

滑动窗口在本题可以理解为 我们取了s中的一个字串 s[i, j], j 不断向后遍历,如果遇到 s[j] 不在set里,就将 s[j]加入set,并更新 当前无重复字符的字符串 的长度result

    若是 s[j] 与set中某个元素相同,就从子串的左边开始删除,一直到那个相同的元素删掉了为止

     例:s = ‘abcbc'

    在set = ('a', 'b', 'c')时很好理解,就是执行了三次while循环,且执行的都是if语句,此时 i = 0,j = 3, result = 3

    第四次循环:s[j] = 'b',这个元素已经存在于集合中了,执行else语句,将 s[i] 从set中删除,set = ('b', 'c'),i = 1

    第五次循环:s[j] = 'b' , 仍然在set中,那么继续执行else语句,将s[i]从set中删除,set = ('c') ,i = 2

    第六次循环:s[j] = 'b' , 不在set中,执行 if 语句,将s[j]加入到set中 ,j = 4,set = ('c', 'b'), result = max(result, j-i) = 3

    这个滑动窗口就找到了s中所有不含重复字符的字串,并且每一次都更新result的值,直到 j 遍历完整个字符串长度

class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
strSet = set() #定义一个空集合,存储 没有重复字符的字符串 里的元素
result = 0
i,j = 0,0
n = len(s)
while j < n:
if s[j] not in strSet: #如果s[j]不在这个集合中
strSet.add(s[j]) #将这个元素加入到集合
j += 1
result = max(result,j-i)
else:
strSet.remove(s[i]) #否则从左边开始删除,直到把重复的那个字符删掉为止
i += 1
return result
  执行用时 :72 ms, 在所有 python3 提交中击败了73.59%的用户
  内存消耗 :12.8 MB, 在所有 python3 提交中击败了99.66%的用户
 
 「this page is for my "xxx"」
 
 
 
 

【leetcode算法-中等】3. 无重复字符的最长字串的更多相关文章

  1. LeetCode-3.无重复字符的最长字串

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

  2. Leetcode3.Longest Substring Without Repeating Characters无重复字符的最长字串

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

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

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: abcabcbb 输出的结果应该是3,最长的无重复的字串是'abc' 果然无论做什么都要静下心来啊!昨晚上卡了一个多小 ...

  4. Leetcode(3)无重复字符的最长子串

    Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果: ...

  5. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  6. leetcode题解#3:无重复字符的最长子串

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

  7. Leetcode题库——3.无重复字符的最长子串

    @author: ZZQ @software: PyCharm @file: lengthOfLongestSubstring.py @time: 2018/9/18 20:35 要求:给定一个字符串 ...

  8. python经典算法题:无重复字符的最长子串

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

  9. LeetCode 第三题--无重复字符的最长子串

    1. 题目 2.题目分析与思路 3.思路 1. 题目 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3 ...

随机推荐

  1. qt动态库实现无边框窗体的消息处理 nativeEvent的使用

    需求: 在动态库中创建一个窗口句柄,可以给外部调用,库的调用者,通过这个句柄发送消息到底层库,库里面可以实现对消息的处理 m_FHandle=AllocateHWnd(WndProcDllMsg); ...

  2. linux系列(八):cp命令

    1.命令格式: cp [选项]... [-T] 源 目的 2.命令功能: 将源文件复制至目标文件,或将多个源文件复制至目标目录. 3.命令参数: -a:此参数的效果和同时指定"-dpR&qu ...

  3. F 阎小罗的Minimax (第十届山东理工大学ACM网络编程擂台赛 正式赛 )

    题解:by Mercury_Lc 阎小罗的矩阵给的n和m都不超过300,枚举一下所有情况就可以了,用前缀和来储存.数组a[x][y]代表前x行前y列的和是多少,那么枚举每一种切割的方式就可以.注意一下 ...

  4. grafana+mysql忘记admin密码解决方法

    通过mysql修改admin的密码. 我之前注册了一个用户,所以我直接复制lvusyy这个用户的密码即可. update user inner join (select password,salt,r ...

  5. P3986 斐波那契数列——数学(EXGCD)

    https://www.luogu.org/problem/P3986 很久很久以前,我好像写过exgcd,但是我已经忘了: 洛谷上搜EXGCD搜不到,要搜(扩展欧几里得) 这道题就是ax+by=k, ...

  6. Django基础之创建admin账号

    1. 首先我们要新建一个用户名, 用来登录管理网站,可以使用如下命令: python manage.py createsuperuser 2. 输入想要使用的用户名: Username(leave b ...

  7. Ubuntu 14.04 改变文件或者文件夹的拥有者

    只有系统管理者(root)才有这样的权限#将文件 file1.txt 的拥有者设为 runoob,群体的使用者 runoobgroupchown runoob:runoobgroup file1.tx ...

  8. Ubuntu14.04 软件安装卸载

    ----常用软件安装 sudo apt-get install vim-gtk //安装vim软件 sudo apt-get install zip //安装解压软件和解压文件 sudo apt-ge ...

  9. python eval的用法

    >>>x = >>> eval( '3 * x' ) >>> eval('pow(2,2)') >>> eval('2 + 2' ...

  10. 在取变量名的时候,千万不要用new

    这样子是会报错的