问题描述

输入一个字符串,找到其中最长的不重复子串

例1:

输入:"abcabcbb"
输出:3
解释:最长非重复子串为"abc"
复制代码

例2:

输入:"bbbbb"
输出:1
解释:最长非重复子串为"b"
复制代码

例3:

输入:"pwwkew"
输出:3
解释:最长非重复子串为"wke"
复制代码

问题难度

Medium

解题思路

本题采用「滑动窗口法」可以达到较理想的时间复杂度 O(n),滑动窗口指的是当前非重复子串所在的窗口,此滑动窗口有两种操作方法

  1. 检查下一个字符是否会重复,如未重复,则将窗口向右扩大
  2. 发现重复字符,则将窗口右边界保持不变,左边界右移,以此缩小窗口

上面的操作比较容易理解,唯一需要注意的是第 2 点中,当发现重复字符时,窗口左边界向右移动几个单位,我们可以看一个示意图:

+---------+
| a b c d | e d x y z
+---------++-----------+
| a b c d e | d x y z // 未发现重复,向右扩大窗口
+-----------++-----+
a b c d | e d | x y z // 发现重复,缩小窗口+-----+
复制代码

假设输入字符串为 "abcdedxyz",一直到我们遍历到字符 e 时,均未发现重复的字符串,至此对窗口进行的操作都是向右扩大,当检查到下一个字符 d 时,由于前面字符串中已经出现过该字符,所以窗口左边界需要进行右移,移动的位置、即新子串窗口的起始点,正好是两个重复字符中、第一个重复字符的右边,如图所示为字符 e 所在的位置。

至此,我们可以开始写程序了:

def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""maxlen = 0current_substring = [None]*128current_substring_len = 0begin_index = 0for i in s:stoi = ord(i)if current_substring[stoi] is None or current_substring[stoi] < begin_index:current_substring[stoi] = begin_index + current_substring_lencurrent_substring_len += 1else:if maxlen < current_substring_len:maxlen = current_substring_len sub_len = current_substring[stoi] - begin_index + 1begin_index = current_substring[stoi] + 1current_substring_len -= sub_lencurrent_substring[stoi] = current_substring_len + begin_indexcurrent_substring_len += 1if maxlen < current_substring_len:maxlen = current_substring_lenreturn maxlen
复制代码

以上代码中,current_substring 是一个缓冲区,用来存放当前子字符串,缓冲区声明为 128 个是为了让数组的下标空间能容纳 128 个 ASCII 字符,即这里用数组的下标来表示字符,这样做的好处是可以很快的知道某个字符是否出现重复,数组的内容我们填的是该字符对应的下标,例如字符串 "abcde" 填到 current_substring 中为:

            index:   0..97  98  99  100 101 ..+---+---+---+---+---+---+---+
current_substring: |...| 0 | 1 | 2 | 3 | 4 |...|+---+---+---+---+---+---+---+
复制代码

我们用变量 begin_index 来记录当前窗口在字符串中的起始位置,而 current_substring_len 用来记录当前窗口的长度。for 循环是对字符串的遍历。

首先将字符转化为其对应的整数 stoi,检查 stoi 中的内容是否为空,或其存储的位置是否在窗口的左边,如是则表示该字符在 begin_index 之后未出现过,非重复子串可以继续累加。

否则表示出现重复,出现重复时,需要将窗口的左边界右移,或者说对新的滑动窗口进行初始化,实际上只需更新 begin_indexcurrent_substring_len 两个值。

最后,我们需要在每一次窗口改变时,或在结束遍历时,判断当前子字符串的长度是否是最长的,并将最长串存储在 maxlen 中,作为结果返回。

原题链接

[LeetCode] 3. Longest Substring Without Repeating Characters 题解相关推荐

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

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

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

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

  3. LeetCode:3. Longest Substring Without Repeating Characters

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

  4. [LeetCode]--3. Longest Substring Without Repeating Characters

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

  5. leetcode 3. Longest Substring Without Repeating Characters | 3. 无重复字符的最长子串(双指针+滑窗)

    题目 https://leetcode.com/problems/longest-substring-without-repeating-characters/ 题解 双指针+滑窗,维护一个 set, ...

  6. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法

    题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...

  7. python刷leetcode_零基础python刷leetcode -- 3. Longest Substring Without Repeating Characters

    算法很重要,但是每天也需要学学python,于是就想用python刷leetcode 的算法题,和我一起开始零基础python刷leetcode之旅吧.如有不对的地方,希望指正,万分感谢~~ 题目 最 ...

  8. LeetCode 3 Longest Substring Without Repeating Characters 区间,想法 难度:1

    https://leetcode.com/problems/longest-substring-without-repeating-characters/ 思路:从某点结束所能取到的最早开头是到目前出 ...

  9. leetcode 3. Longest Substring Without Repeating Characters

    记得这要+1,j = std::max(j,container[s[i]]+1); class Solution { public:int lengthOfLongestSubstring(strin ...

最新文章

  1. sublime text3 前端插件介绍
  2. Python爬虫实战,requests模块,Python实现抓取王者荣耀全套皮肤
  3. 当执行进程ctrl+c关闭不了的时候的解决方法
  4. 浅谈怎么玩好微博如何做微博营销
  5. 空格 过滤多个_CAD选择过滤器的运算符如何使用?
  6. 【转载】MSDN上发现了一篇很好的WCF入门教程
  7. 因严重 OpenSSL 漏洞,Fedora 37 推迟至 11 月中旬发布
  8. 专访Facebook HipHop作者、阿里研究员赵海平:生物与计算机交织的独特人生
  9. SPSS进行多元线性回归
  10. imatest白平衡测试结果解析
  11. 区块链底层平台有哪些 区块链底层平台搭建
  12. 磨金石教育摄影技能干货分享|有哪些风格独特的摄影作品
  13. ionic自定义图标
  14. 国家天文台结盟阿里云:计算100亿光年的数字宇宙
  15. Solidity如何通过代码减少gas消耗
  16. 湖北公安机关出台10条措施服务民营经济发展
  17. Uncaught TypeError: ‘set‘ on proxy: trap returned falsish for property ‘visible‘
  18. java springboot+mybaits 实现数据库增删改查案例
  19. 鸿蒙系统可以安装当贝市场吗,华为智慧屏V85怎么样?怎么安装第三方软件当贝市场?...
  20. linux复现数据库,基于嵌入式Linux系统平台并可应用于监控组态软件实时数据库的设计方案详解...

热门文章

  1. html中表单元素_HTML中的表单元素
  2. FreeRTOS中断配置与临界段
  3. 【竞赛题解】Codeforces Round #710 (Div. 3)
  4. BestCoder Round #86 1003 HDU 5806——NanoApe Loves Sequence Ⅱ
  5. 485. 最大连续1的个数 golang
  6. Redis运维和开发学习笔记(7) 内存管理和过期策略
  7. linux之地址空间
  8. mysql主从虚拟机_虚拟机centos7Mysql实现主从配置
  9. 字符串题目 1 --------判断两个字符串是否为旋转词
  10. HDU - 6278 Just $h$-index主席树+二分